From 5677c23f2ac4b9e099e8e4e4fee72780f303b16c Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 08:36:03 -0600 Subject: Added useful dev files --- .clang-format | 4 ++++ useful_files/git-hooks/install.sh | 2 ++ useful_files/git-hooks/pre-commit | 4 ++++ useful_files/git-hooks/pre-commit.py | 23 +++++++++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 .clang-format create mode 100755 useful_files/git-hooks/install.sh create mode 100755 useful_files/git-hooks/pre-commit create mode 100755 useful_files/git-hooks/pre-commit.py diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..f3171ca --- /dev/null +++ b/.clang-format @@ -0,0 +1,4 @@ +IndentWidth: '4' +TabWidth: '4' +UseTab: Always +ColumnLimit: 120 \ No newline at end of file diff --git a/useful_files/git-hooks/install.sh b/useful_files/git-hooks/install.sh new file mode 100755 index 0000000..adefea7 --- /dev/null +++ b/useful_files/git-hooks/install.sh @@ -0,0 +1,2 @@ +ROOT=`git rev-parse --show-toplevel` +cp * $ROOT/.git/hooks diff --git a/useful_files/git-hooks/pre-commit b/useful_files/git-hooks/pre-commit new file mode 100755 index 0000000..a475759 --- /dev/null +++ b/useful_files/git-hooks/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh + +DIRNAME=`dirname "$0"` +python2.7 $DIRNAME/pre-commit.py $@ diff --git a/useful_files/git-hooks/pre-commit.py b/useful_files/git-hooks/pre-commit.py new file mode 100755 index 0000000..565c363 --- /dev/null +++ b/useful_files/git-hooks/pre-commit.py @@ -0,0 +1,23 @@ +import subprocess + +try: + run_args = ["git", "clang-format"] + + print("Running clang-format...") + output = subprocess.check_output(run_args) + print output + changed_list = output.split('\n') + if changed_list[0] == 'changed files:': + changed_list.pop(0) + for changed in changed_list: + if len(changed.strip()) > 0: + add_output = subprocess.check_output(['git', 'add', changed.strip()]) + if len(add_output) > 0: + print(add_output) + exit(0) +except subprocess.CalledProcessError as e: + print(e.output) + exit(1) +except Exception as e: + print "Clang format not installed; please install: ", e + exit(0) -- cgit v1.2.3 From 3fd7b740119e86d404d06bceafb02267d6e539c4 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 14:07:59 +0000 Subject: Added tracker to vive rules list --- useful_files/81-vive.rules | 1 + 1 file changed, 1 insertion(+) diff --git a/useful_files/81-vive.rules b/useful_files/81-vive.rules index 02a57f1..ec4bba5 100644 --- a/useful_files/81-vive.rules +++ b/useful_files/81-vive.rules @@ -18,6 +18,7 @@ SUBSYSTEM=="usb", ATTRS{idVendor}=="114d", ATTRS{idProduct}=="8a12", TAG+="uacce SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="2c87", MODE="0666" # HTC HMD SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2000", MODE="0666" # Light input SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2101", MODE="0666" # Watchman +SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2012", MODE="0666" # Tracker #KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0bb4", ATTR{idProduct}=="2c87", MODE="0666" # HTC #KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="28de", ATTR{idProduct}=="2000", MODE="0666" # Valve -- cgit v1.2.3 From 17e06b4822e60ccca865e77b45bf2b52a26852f2 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 14:42:53 +0000 Subject: Made picking posers more consistent / configposer can use short name --- src/survive.c | 22 ++++++++++++++-------- src/survive_cal.c | 26 ++------------------------ src/survive_internal.h | 3 ++- 3 files changed, 18 insertions(+), 33 deletions(-) diff --git a/src/survive.c b/src/survive.c index e6bf69f..a8e7b94 100644 --- a/src/survive.c +++ b/src/survive.c @@ -199,7 +199,8 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { return ctx; } -static void *setup_func_by_name(SurviveContext *ctx, const char *name, const char *configname, const char *configdef) { +void *GetDriverByConfig(SurviveContext *ctx, const char *name, const char *configname, const char *configdef, + int verbose) { const char *Preferred = survive_configs(ctx, configname, SC_SETCONFIG, configdef); const char *DriverName = 0; const char *picked = 0; @@ -207,12 +208,14 @@ static void *setup_func_by_name(SurviveContext *ctx, const char *name, const cha void *func = 0; int prefixLen = strlen(name); - SV_INFO("Available %s:", name); + if (verbose > 1) + SV_INFO("Available %s:", name); while ((DriverName = GetDriverNameMatching(name, i++))) { void *p = GetDriver(DriverName); bool match = strcmp(DriverName, Preferred) == 0 || strcmp(DriverName + prefixLen, Preferred) == 0; - SV_INFO("\t%c%s", match ? '*' : ' ', DriverName + prefixLen); + if (verbose > 1) + SV_INFO("\t%c%s", match ? '*' : ' ', DriverName + prefixLen); if (!func || match) { func = p; picked = (DriverName + prefixLen); @@ -221,7 +224,10 @@ static void *setup_func_by_name(SurviveContext *ctx, const char *name, const cha if (!func) { SV_ERROR("Error. Cannot find any valid %s.", name); } - SV_INFO("Totals %d %ss. Using %s.", i - 1, name, picked); + if (verbose > 1) + SV_INFO("Totals %d %ss.", i - 1, name); + if (verbose > 0) + SV_INFO("Using %s for %s", name, configname); return func; } @@ -230,6 +236,8 @@ int survive_startup(SurviveContext *ctx) { int r = 0; int i = 0; + survive_install_recording(ctx); + // initialize the button queue memset(&(ctx->buttonQueue), 0, sizeof(ctx->buttonQueue)); ctx->buttonQueue.buttonservicesem = OGCreateSema(); @@ -237,15 +245,13 @@ int survive_startup(SurviveContext *ctx) { // start the thread to process button data ctx->buttonservicethread = OGCreateThread(button_servicer, ctx); - PoserCB PreferredPoserCB = setup_func_by_name(ctx, "Poser", "defaultposer", "PoserTurveyTori"); - ctx->lightcapfunction = setup_func_by_name(ctx, "Disambiguator", "disambiguator", "Turvey"); + PoserCB PreferredPoserCB = GetDriverByConfig(ctx, "Poser", "defaultposer", "TurveyTori", 2); + ctx->lightcapfunction = GetDriverByConfig(ctx, "Disambiguator", "disambiguator", "Turvey", 2); const char *DriverName; i = 0; - survive_install_recording(ctx); - while ((DriverName = GetDriverNameMatching("DriverReg", i++))) { DeviceDriver dd = GetDriver(DriverName); SV_INFO("Loading driver %s (%p) (%d)", DriverName, dd, i); diff --git a/src/survive_cal.c b/src/survive_cal.c index 3367aa0..c94bd0d 100755 --- a/src/survive_cal.c +++ b/src/survive_cal.c @@ -184,30 +184,8 @@ void survive_cal_install( struct SurviveContext * ctx ) } const char * DriverName; -// const char * PreferredPoser = survive_configs(ctx, "configposer", "PoserCharlesSlow"); - const char * PreferredPoser = survive_configs(ctx, "configposer", SC_SETCONFIG, "PoserTurveyTori"); - - SV_INFO( "Trying to load poser %s for cal.", PreferredPoser ); - PoserCB SelectedPoserCB = 0; - const char * SelectedPoserName = 0; - i = 0; - while( ( DriverName = GetDriverNameMatching( "Poser", i++ ) ) ) - { - PoserCB p = GetDriver( DriverName ); - if( !SelectedPoserCB ) - { - SelectedPoserCB = p; - SelectedPoserName = DriverName; - } - int ThisPoser = strcmp( DriverName, PreferredPoser ) == 0; - if( ThisPoser ) - { - SelectedPoserCB = p; - SelectedPoserName = DriverName; - } - } - cd->ConfigPoserFn = SelectedPoserCB; - SV_INFO( "Got config poser: %s (%p)", SelectedPoserName, cd->ConfigPoserFn ); + cd->ConfigPoserFn = GetDriverByConfig(ctx, "Poser", "configposer", "TurveyTori", 0); + ootx_packet_clbk = ootx_packet_clbk_d; ctx->calptr = cd; diff --git a/src/survive_internal.h b/src/survive_internal.h index 86b119f..9120f41 100644 --- a/src/survive_internal.h +++ b/src/survive_internal.h @@ -16,7 +16,8 @@ void * GetDriver( const char * name ); const char * GetDriverNameMatching( const char * prefix, int place ); void ListDrivers(); - +void *GetDriverByConfig(SurviveContext *ctx, const char *name, const char *configname, const char *configdef, + int verbose); #endif -- cgit v1.2.3 From d475a433ec40f335fa0bffdf774bac4c69d7fc10 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 14:43:32 +0000 Subject: Made calibration installation driveable from the command line; also turns on if there is no calibration --- data_recorder.c | 4 ---- src/survive.c | 25 +++++++++++++++++++++++++ src/survive_cal.c | 3 +++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/data_recorder.c b/data_recorder.c index eef233d..427a953 100644 --- a/data_recorder.c +++ b/data_recorder.c @@ -17,10 +17,6 @@ int main(int argc, char **argv) { } survive_startup(ctx); - if (survive_configi(ctx, "calibrate", SC_GET, 1)) { - SV_INFO("Installing calibration"); - survive_cal_install(ctx); - } while (survive_poll(ctx) == 0) { } diff --git a/src/survive.c b/src/survive.c index a8e7b94..3f3b844 100644 --- a/src/survive.c +++ b/src/survive.c @@ -269,6 +269,31 @@ int survive_startup(SurviveContext *ctx) { ctx->state = SURVIVE_RUNNING; + int calibrateMandatory = survive_configi(ctx, "calibrate", SC_GET, 0); + int calibrateForbidden = survive_configi(ctx, "no-calibrate", SC_GET, 0); + if (calibrateMandatory && calibrateForbidden) { + SV_INFO("Contradictory settings --calibrate and --no-calibrate specified. Switching to normal behavior."); + calibrateMandatory = calibrateForbidden = 0; + } + + if (!calibrateForbidden) { + bool isCalibrated = true; + for (int i = 0; i < ctx->activeLighthouses; i++) { + isCalibrated &= ctx->bsd[i].PositionSet; + } + + if (!isCalibrated) { + SV_INFO("Uncalibrated configuration detected. Attaching calibration. Please don't move tracked objects for " + "the duration of calibration. Pass '--no-calibrate' to skip calibration"); + } + + bool doCalibrate = isCalibrated == false || calibrateMandatory; + + if (doCalibrate) { + survive_cal_install(ctx); + } + } + return 0; } diff --git a/src/survive_cal.c b/src/survive_cal.c index c94bd0d..218f5c1 100755 --- a/src/survive_cal.c +++ b/src/survive_cal.c @@ -116,6 +116,9 @@ int survive_cal_get_status( struct SurviveContext * ctx, char * description, int void survive_cal_install( struct SurviveContext * ctx ) { + if (ctx->calptr) + return; + int i; struct SurviveCalData * cd = ctx->calptr = calloc( 1, sizeof( struct SurviveCalData ) ); -- cgit v1.2.3 From 33ca53f2dae6ea078944d34846a2b99cc879bcc2 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 14:56:37 +0000 Subject: Actually add tracker to rules list -- value before was the wired controller --- useful_files/81-vive.rules | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/useful_files/81-vive.rules b/useful_files/81-vive.rules index ec4bba5..ea5be37 100644 --- a/useful_files/81-vive.rules +++ b/useful_files/81-vive.rules @@ -6,6 +6,8 @@ KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="28de", ATTRS{idProduct KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2050", TAG+="uaccess" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2011", TAG+="uaccess" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2012", TAG+="uaccess" +KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2022", TAG+="uaccess" + SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="2c87", TAG+="uaccess" # HTC Camera USB Node SUBSYSTEM=="usb", ATTRS{idVendor}=="114d", ATTRS{idProduct}=="8328", TAG+="uaccess" @@ -18,7 +20,8 @@ SUBSYSTEM=="usb", ATTRS{idVendor}=="114d", ATTRS{idProduct}=="8a12", TAG+="uacce SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="2c87", MODE="0666" # HTC HMD SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2000", MODE="0666" # Light input SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2101", MODE="0666" # Watchman -SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2012", MODE="0666" # Tracker +SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2012", MODE="0666" # Watchman wired +SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", ATTRS{idProduct}=="2022", MODE="0666" # Tracker wired #KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0bb4", ATTR{idProduct}=="2c87", MODE="0666" # HTC #KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="28de", ATTR{idProduct}=="2000", MODE="0666" # Valve -- cgit v1.2.3 From d3155686ea518b1c5335c5b61bd57131423d64fc Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 11:26:59 -0600 Subject: Refactor viz tool to be able to use it as a library --- tools/viz/survive_viewer.js | 275 +++++++++++++++++++++----------------------- 1 file changed, 134 insertions(+), 141 deletions(-) diff --git a/tools/viz/survive_viewer.js b/tools/viz/survive_viewer.js index 81de2a0..0710c68 100644 --- a/tools/viz/survive_viewer.js +++ b/tools/viz/survive_viewer.js @@ -5,6 +5,9 @@ var angles = {}; var ctx; var canvas; var oldDrawTime = 0; +var timecode = {}; +var oldPoseTime = 0, poseCnt = 0; +var scene, camera, renderer, floor; $(function() { $("#toggleBtn").click(function() { $("#cam").toggle(); }); }); @@ -16,16 +19,16 @@ function add_lighthouse(idx, p, q) { group.position.fromArray(p); group.quaternion.fromArray([ q[1], q[2], q[3], q[0] ]); - var height = 3; - var geometry = new THREE.ConeGeometry(Math.sin(1.0472) * height, height, 4, 1, true); + var height = 10; + + var geometry = new THREE.ConeGeometry(height / Math.cos(60 / 180 * Math.PI), height, 4, 1, true); var material = new THREE.MeshBasicMaterial({ - wireframe : true, - vertexColor : true, - color : 0x111111, - opacity : 0.09, + color : 0x1F1FFF, + opacity : 0.02, transparent : true, blending : THREE.AdditiveBlending, - side : THREE.BothSides + side : THREE.DoubleSide, + depthTest : false }); var cone = new THREE.Mesh(geometry, material); @@ -34,16 +37,14 @@ function add_lighthouse(idx, p, q) { var lhBox = new THREE.Mesh(lhBoxGeom, lhBoxMaterial); group.add(lhBox); - cone.translateZ(-height / 2) - cone.rotateZ(Math.PI / 4) - cone.rotateX(Math.PI / 2) - // cone.position.z + cone.translateZ(-height / 2); + cone.rotateZ(Math.PI / 4); + cone.rotateX(Math.PI / 2); group.add(cone); group.add(lh); scene.add(group); - // DrawCoordinateSystem(p[0], p[1], p[2], q[0], q[1], q[2], q[3]); } function recolorTrackers(when) { @@ -157,7 +158,7 @@ function redrawCanvas(when) { } } -function create_object(info) { +function create_tracked_object(info) { var sensorGeometry = new THREE.SphereGeometry(.01, 32, 16); var group = new THREE.Group(); group.sensors = []; @@ -184,149 +185,141 @@ function create_object(info) { scene.add(group); } -var timecode = {}; +var survive_log_handlers = { + "LH_POSE" : function(v) { + var obj = { + lighthouse : parseInt(v[1]), + position : [ parseFloat(v[3]), parseFloat(v[4]), parseFloat(v[5]) ], + quat : [ parseFloat(v[6]), parseFloat(v[7]), parseFloat(v[8]), parseFloat(v[9]) ] + }; -function parseLine(msg) { - var s = msg.split(' '); + add_lighthouse(obj.lighthouse, obj.position, obj.quat); + }, + "POSE" : function(v, tracker) { + var obj = { + tracker : v[1], + position : [ parseFloat(v[3]), parseFloat(v[4]), parseFloat(v[5]) ], + quat : [ parseFloat(v[6]), parseFloat(v[7]), parseFloat(v[8]), parseFloat(v[9]) ] + }; - var command_mappings = { - "LH_POSE" : function(v) { - return { - type : "lighthouse_pose", - lighthouse : parseInt(v[1]), - position : [ parseFloat(v[3]), parseFloat(v[4]), parseFloat(v[5]) ], - quat : [ parseFloat(v[6]), parseFloat(v[7]), parseFloat(v[8]), parseFloat(v[9]) ] - }; - }, - "POSE" : function(v) { - return { - type: "pose", position: [ parseFloat(v[3]), parseFloat(v[4]), parseFloat(v[5]) ], - quat: [ parseFloat(v[6]), parseFloat(v[7]), parseFloat(v[8]), parseFloat(v[9]) ] + if (objs[obj.tracker]) { + var now = new Date().getTime(); + if (oldPoseTime + 5000 < now) { + oldPoseTime = now; + console.log((poseCnt / 5) + "hz"); + poseCnt = 0; } - }, - "CONFIG" : function(v) { - var configStr = s.slice(3).join(' '); - var config = JSON.parse(configStr); - - return { type: "htc_config", config: config } - - }, - 'A' : function(v) { - return { - type: 'angle', sensor_id: parseInt(v[3]), acode: parseInt(v[4]), timecode: parseInt(v[5]), - length: parseFloat(v[6]), angle: parseFloat(v[7]), lighthouse: parseInt(v[8]) + poseCnt++; + objs[obj.tracker].position.set(obj.position[0], obj.position[1], obj.position[2]); + objs[obj.tracker].quaternion.set(obj.quat[1], obj.quat[2], obj.quat[3], obj.quat[0]); + objs[obj.tracker].verticesNeedUpdate = true; + timecode[obj.tracker] = obj.timecode; + } + }, + "CONFIG" : function(v, tracker) { + var configStr = v.slice(3).join(' '); + var config = JSON.parse(configStr); + var obj = {config : config, tracker : v[1]}; + + create_tracked_object(obj); + }, + 'A' : function(v, tracker) { + var obj = { + tracker : v[1], + sensor_id : parseInt(v[3]), + acode : parseInt(v[4]), + timecode : parseInt(v[5]), + length : parseFloat(v[6]), + angle : parseFloat(v[7]), + lighthouse : parseInt(v[8]) + }; + + angles[obj.tracker] = angles[obj.tracker] || {}; + angles[obj.tracker][obj.lighthouse] = angles[obj.tracker][obj.lighthouse] || {}; + angles[obj.tracker][obj.lighthouse][obj.sensor_id] = angles[obj.tracker][obj.lighthouse][obj.sensor_id] || {}; + + angles[obj.tracker][obj.lighthouse][obj.sensor_id][obj.acode & 1] = [ obj.angle, obj.timecode ]; + timecode[obj.tracker] = obj.timecode; + }, + 'LOG' : function(v) { + var msg = v.slice(3).join(' '); + + var consoleDiv = $("#console"); + consoleDiv.append(msg + "
"); + consoleDiv[0].scrollTop = consoleDiv[0].scrollHeight; + + }, + "I" : function(v, tracker) { + var obj = { + mask : parseInt(v[3]), + timecode : parseInt(v[4]), + accelgyro : [ + parseFloat(v[5]), parseFloat(v[6]), parseFloat(v[7]), parseFloat(v[8]), parseFloat(v[9]), + parseFloat(v[10]) + ], + tracker : v[1] + }; + + if (objs[obj.tracker]) { + if (!downAxes[obj.tracker] && objs[obj.tracker]) { + downAxes[obj.tracker] = new THREE.Geometry(); + downAxes[obj.tracker].vertices.push(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, 0)); + + var line = new THREE.Line(downAxes[obj.tracker], new THREE.LineBasicMaterial({color : 0xffffff})); + scene.add(line); + } + + if (objs[obj.tracker].position) { + var q = obj.accelgyro; + + downAxes[obj.tracker].vertices[0] = objs[obj.tracker].position; + downAxes[obj.tracker].vertices[1].fromArray(q); + downAxes[obj.tracker].vertices[1].add(objs[obj.tracker].position); + downAxes[obj.tracker].verticesNeedUpdate = true; } - }, - 'LOG' : function(v) { - return { type: "info", msg: s.slice(3).join(' ') } - }, - "I" : function(v) { - return { - type : "imu", - mask : parseInt(v[3]), - timecode : parseInt(v[4]), - accelgyro : [ - parseFloat(v[5]), parseFloat(v[6]), parseFloat(v[7]), parseFloat(v[8]), parseFloat(v[9]), - parseFloat(v[10]) - ] - - }; } - }; - if (command_mappings[s[2]]) { - var rtn = command_mappings[s[2]](s); - rtn.time = parseFloat(s[0]); - rtn.tracker = s[1]; - return rtn; + + } +}; + +function add_survive_log_handler(name, entry) { survive_log_handlers[name] = entry; } +function process_survive_handlers(msg) { + var s = msg.split(' '); + + if (survive_log_handlers[s[2]]) { + survive_log_handlers[s[2]](s); } + return {}; } -var oldPoseTime = 0, poseCnt = 0; + +var survive_ws; + +// Dial up the websocket $(function() { setTimeout(function() { - var ws; - if (window.location.protocol === "file:") { - ws = new WebSocket("ws://localhost:8080/ws"); + var url = new URL(window.location.href); + var remote = url.searchParams.get("remote"); + + if (remote.length) { + survive_ws = new WebSocket("ws://" + remote + "/ws"); + } else if (window.location.protocol === "file:") { + survive_ws = new WebSocket("ws://localhost:8080/ws"); } else { - ws = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + - "/ws"); + survive_ws = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + + window.location.host + "/ws"); } - ws.onopen = function(evt) { - // ws.send("!"); - }; - ws.onmessage = function(evt) { + survive_ws.onmessage = function(evt) { var msg = evt.data; - var obj; - if (msg[0] == "{") - obj = JSON.parse(msg); - else - obj = parseLine(msg); - - // console.log(obj); - if (obj.type === "pose") { - if (objs[obj.tracker]) { - var now = new Date().getTime(); - if(oldPoseTime + 5000 < now) { - oldPoseTime = now; - console.log( (poseCnt / 5) + "hz"); - poseCnt = 0; - } - poseCnt++; - objs[obj.tracker].position.set(obj.position[0], obj.position[1], obj.position[2]); - objs[obj.tracker].quaternion.set(obj.quat[1], obj.quat[2], obj.quat[3], obj.quat[0]); - objs[obj.tracker].verticesNeedUpdate = true; - timecode[obj.tracker] = obj.timecode; - } - } else if (obj.type === "info") { - var consoleDiv = $("#console"); - consoleDiv.append(obj.msg + "
"); - consoleDiv[0].scrollTop = consoleDiv[0].scrollHeight; - } else if (obj.type === "lighthouse_pose") { - add_lighthouse(obj.lighthouse, obj.position, obj.quat); - } else if (obj.type === "htc_config") { - create_object(obj); - } else if (obj.type === "imu") { - if (objs[obj.tracker]) { - if (!downAxes[obj.tracker] && objs[obj.tracker]) { - downAxes[obj.tracker] = new THREE.Geometry(); - downAxes[obj.tracker].vertices.push(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, 0)); - - var line = - new THREE.Line(downAxes[obj.tracker], new THREE.LineBasicMaterial({color : 0xffffff})); - scene.add(line); - } - - if (objs[obj.tracker].position) { - var q = obj.accelgyro; - - downAxes[obj.tracker].vertices[0] = objs[obj.tracker].position; - downAxes[obj.tracker].vertices[1].fromArray(q); - downAxes[obj.tracker].vertices[1].add(objs[obj.tracker].position); - downAxes[obj.tracker].verticesNeedUpdate = true; - } - } - - } else if (obj.type === "angle") { - angles[obj.tracker] = angles[obj.tracker] || {}; - angles[obj.tracker][obj.lighthouse] = angles[obj.tracker][obj.lighthouse] || {}; - angles[obj.tracker][obj.lighthouse][obj.sensor_id] = - angles[obj.tracker][obj.lighthouse][obj.sensor_id] || {}; - - angles[obj.tracker][obj.lighthouse][obj.sensor_id][obj.acode & 1] = [ obj.angle, obj.timecode ]; - timecode[obj.tracker] = obj.timecode; - } - - // ws.send("!"); + process_survive_handlers(msg); }; + }, 60); // Hacky, but this gives the server time to restart on CTRL+R }); -// standard global variables -var container, scene, camera, renderer, controls; - -// custom global variables +// Init and start the render loop $(function() { // initialization init(); @@ -367,7 +360,7 @@ init() { renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT); // attach div element to variable to contain the renderer - container = document.getElementById('ThreeJS'); + var container = document.getElementById('ThreeJS'); // attach renderer to the container div container.appendChild(renderer.domElement); @@ -375,17 +368,17 @@ init() { // move mouse and: left click to rotate, // middle click to zoom, // right click to pan - controls = new THREE.OrbitControls(camera, renderer.domElement); + var controls = new THREE.OrbitControls(camera, renderer.domElement); // create a light var light = new THREE.PointLight(0xffffff); - light.position.set(0, 5, 0); + light.position.set(0, 0, 5); scene.add(light); var floorMaterial = new THREE.MeshBasicMaterial({color : 0x000000, opacity : 0.15, transparent : true, side : THREE.FrontSide}); var floorGeometry = new THREE.PlaneGeometry(10, 10); - var floor = new THREE.Mesh(floorGeometry, floorMaterial); + floor = new THREE.Mesh(floorGeometry, floorMaterial); floor.position.z = -1; scene.add(floor); -- cgit v1.2.3 From 8c247ac2aaa5e6de4c52cae05e9b5aec736b3e70 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 07:26:31 +0000 Subject: Added reset cntr for sba --- src/poser_sba.c | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/poser_sba.c b/src/poser_sba.c index d1677d1..d36c264 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -30,6 +30,13 @@ typedef struct { int lh; } sba_context_single_sweep; +typedef struct SBAData { + int last_acode; + int last_lh; + int failures_to_reset; + int failures_to_reset_cntr; +} SBAData; + void metric_function(int j, int i, double *aj, double *xij, void *adata) { sba_context *ctx = (sba_context *)(adata); SurviveObject *so = ctx->so; @@ -181,7 +188,7 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < 8) { if (so->ctx->bsd[0].PositionSet && so->ctx->bsd[1].PositionSet && failure_count++ == 500) { SurviveContext *ctx = so->ctx; - SV_INFO("Can't solve for position with just %lu measurements", meas_size); + SV_INFO("Can't solve for position with just %u measurements", (unsigned int)meas_size); failure_count = 0; } return -1; @@ -253,7 +260,7 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config // Docs say info[0] should be divided by meas; I don't buy it really... static int cnt = 0; if (cnt++ > 1000 || meas_size < 8) { - SV_INFO("%f original reproj error for %lu meas", (info[0] / meas_size * 2), meas_size); + SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (unsigned int)meas_size); SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); cnt = 0; } @@ -262,9 +269,9 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config return info[1] / meas_size * 2; } -static double run_sba_find_3d_structure(survive_calibration_config options, PoserDataLight *pdl, SurviveObject *so, - SurviveSensorActivations *scene, int max_iterations /* = 50*/, - double max_reproj_error /* = 0.005*/) { +static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config options, PoserDataLight *pdl, + SurviveObject *so, SurviveSensorActivations *scene, + int max_iterations /* = 50*/, double max_reproj_error /* = 0.005*/) { double *covx = 0; char *vmask = alloca(sizeof(char) * so->sensor_ct * NUM_LIGHTHOUSES); @@ -275,7 +282,7 @@ static double run_sba_find_3d_structure(survive_calibration_config options, Pose if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < 7) { if (so->ctx->bsd[0].PositionSet && so->ctx->bsd[1].PositionSet && failure_count++ == 500) { SurviveContext *ctx = so->ctx; - SV_INFO("Can't solve for position with just %lu measurements", meas_size); + SV_INFO("Can't solve for position with just %u measurements", (unsigned int)meas_size); failure_count = 0; } return -1; @@ -285,10 +292,12 @@ static double run_sba_find_3d_structure(survive_calibration_config options, Pose SurvivePose soLocation = so->OutPose; bool currentPositionValid = quatmagnitude(&soLocation.Rot[0]) != 0; - { + if (d->failures_to_reset_cntr == 0 || currentPositionValid == 0) { + SurviveContext *ctx = so->ctx; + SV_INFO("Must rerun seed poser"); const char *subposer = config_read_str(so->ctx->global_config_values, "SBASeedPoser", "PoserEPNP"); PoserCB driver = (PoserCB)GetDriver(subposer); - SurviveContext *ctx = so->ctx; + if (driver) { PoserData hdr = pdl->hdr; memset(&pdl->hdr, 0, sizeof(pdl->hdr)); // Clear callback functions @@ -340,6 +349,7 @@ static double run_sba_find_3d_structure(survive_calibration_config options, Pose info); // info if (status > 0) { + d->failures_to_reset_cntr = d->failures_to_reset; quatnormalize(soLocation.Rot, soLocation.Rot); PoserData_poser_raw_pose_func(&pdl->hdr, so, 1, &soLocation); } @@ -349,7 +359,7 @@ static double run_sba_find_3d_structure(survive_calibration_config options, Pose // Docs say info[0] should be divided by meas; I don't buy it really... static int cnt = 0; if (cnt++ > 1000 || meas_size < 8) { - SV_INFO("%f original reproj error for %lu meas", (info[0] / meas_size * 2), meas_size); + SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (int)meas_size); SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); cnt = 0; } @@ -435,21 +445,19 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd { SurviveContext *ctx = so->ctx; // Docs say info[0] should be divided by meas; I don't buy it really... - SV_INFO("%f original reproj error for %lu meas", (info[0] / meas_size * 2), meas_size); + SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (int)meas_size); SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); } return info[1] / meas_size * 2; } -typedef struct SBAData { - int last_acode; - int last_lh; -} SBAData; - int PoserSBA(SurviveObject *so, PoserData *pd) { if (so->PoserData == 0) { so->PoserData = calloc(1, sizeof(SBAData)); + SBAData *d = so->PoserData; + d->failures_to_reset_cntr = 0; + d->failures_to_reset = 30; } SBAData *d = so->PoserData; SurviveContext *ctx = so->ctx; @@ -465,18 +473,23 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { FLT error = -1; if (d->last_lh != lightData->lh || d->last_acode != lightData->acode) { survive_calibration_config config = *survive_calibration_default_config(); - error = run_sba_find_3d_structure(config, lightData, so, scene, 50, .5); + error = run_sba_find_3d_structure(d, config, lightData, so, scene, 50, .5); d->last_lh = lightData->lh; d->last_acode = lightData->acode; } + if (error < 0) { + if (d->failures_to_reset_cntr > 0) + d->failures_to_reset_cntr--; + } + return 0; } case POSERDATA_FULL_SCENE: { SurviveContext *ctx = so->ctx; PoserDataFullScene *pdfs = (PoserDataFullScene *)(pd); survive_calibration_config config = *survive_calibration_default_config(); - SV_INFO("Running sba with %lu", survive_calibration_config_index(&config)); + SV_INFO("Running sba with %u", (int)survive_calibration_config_index(&config)); double error = run_sba(config, pdfs, so, 50, .005); // std::cerr << "Average reproj error: " << error << std::endl; return 0; -- cgit v1.2.3 From 5e8633ecc6f1309b5be2dd86b61e8a7b0a9f5ecb Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sat, 24 Mar 2018 00:10:24 -0600 Subject: Added success counter to sba too --- src/poser_sba.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/poser_sba.c b/src/poser_sba.c index d36c264..c01cc61 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -35,6 +35,8 @@ typedef struct SBAData { int last_lh; int failures_to_reset; int failures_to_reset_cntr; + int successes_to_reset; + int successes_to_reset_cntr; } SBAData; void metric_function(int j, int i, double *aj, double *xij, void *adata) { @@ -292,9 +294,9 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o SurvivePose soLocation = so->OutPose; bool currentPositionValid = quatmagnitude(&soLocation.Rot[0]) != 0; - if (d->failures_to_reset_cntr == 0 || currentPositionValid == 0) { + if (d->successes_to_reset_cntr == 0 || d->failures_to_reset_cntr == 0 || currentPositionValid == 0) { SurviveContext *ctx = so->ctx; - SV_INFO("Must rerun seed poser"); + // SV_INFO("Must rerun seed poser"); const char *subposer = config_read_str(so->ctx->global_config_values, "SBASeedPoser", "PoserEPNP"); PoserCB driver = (PoserCB)GetDriver(subposer); @@ -310,11 +312,12 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o pdl->hdr = hdr; if (locations.hasInfo == false) { - return -1; } else if (locations.hasInfo) { soLocation = locations.poses; } + + d->successes_to_reset_cntr = d->successes_to_reset; } else { SV_INFO("Not using a seed poser for SBA; results will likely be way off"); } @@ -457,7 +460,9 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { so->PoserData = calloc(1, sizeof(SBAData)); SBAData *d = so->PoserData; d->failures_to_reset_cntr = 0; - d->failures_to_reset = 30; + d->failures_to_reset = 5; + d->successes_to_reset_cntr = 0; + d->successes_to_reset = 20; } SBAData *d = so->PoserData; SurviveContext *ctx = so->ctx; @@ -481,6 +486,9 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { if (error < 0) { if (d->failures_to_reset_cntr > 0) d->failures_to_reset_cntr--; + } else { + if (d->successes_to_reset_cntr > 0) + d->successes_to_reset_cntr--; } return 0; -- cgit v1.2.3 From 378b6e58d4cb0e9873062cfabefa271e43794bd6 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 23 Mar 2018 16:19:22 +0000 Subject: Broadcast lighthouse position at startup --- src/survive.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/survive.c b/src/survive.c index 3f3b844..1786d45 100644 --- a/src/survive.c +++ b/src/survive.c @@ -294,6 +294,13 @@ int survive_startup(SurviveContext *ctx) { } } + // If lighthouse positions are known, broadcast them + for (int i = 0; i < ctx->activeLighthouses; i++) { + if(ctx->bsd[i].PositionSet) { + ctx->lighthouseposeproc(ctx, i, &ctx->bsd[i].Pose, 0); + } + } + return 0; } -- cgit v1.2.3 From ef7f9229a23e3ade8c6b5c33cbfaa684b80909b2 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sat, 24 Mar 2018 03:44:02 -0400 Subject: add option to log lightdata to separate file. --- src/survive_disambiguator.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/survive_disambiguator.c b/src/survive_disambiguator.c index 39b23b6..cf89068 100644 --- a/src/survive_disambiguator.c +++ b/src/survive_disambiguator.c @@ -1,3 +1,16 @@ #include "survive.h" +#include +#include -void handle_lightcap(SurviveObject *so, LightcapElement *le) { so->ctx->lightcapfunction(so, le); } +//#define LOG_LIGHTDATA + +void handle_lightcap(SurviveObject *so, LightcapElement *le) +{ +#ifdef LOG_LIGHTDATA + static FILE * flog; + static double start = 0; + if( !flog ) { flog = fopen( "lightcap.txt", "wb" ); start = OGGetAbsoluteTime(); } + fprintf( flog, "%.6f %2d %4d %9d\n", OGGetAbsoluteTime()-start, le->sensor_id, le->length, le->timestamp ); +#endif + so->ctx->lightcapfunction(so, le); +} -- cgit v1.2.3 From 5339216719825ba8aac0ae6507014d4a8115890f Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sat, 24 Mar 2018 01:09:42 -0600 Subject: Viz with chemtrails --- tools/viz/index.html | 1 + tools/viz/survive_viewer.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/tools/viz/index.html b/tools/viz/index.html index b146b5d..0221b41 100644 --- a/tools/viz/index.html +++ b/tools/viz/index.html @@ -12,6 +12,7 @@
+ Trails
diff --git a/tools/viz/survive_viewer.js b/tools/viz/survive_viewer.js index 0710c68..70aecfa 100644 --- a/tools/viz/survive_viewer.js +++ b/tools/viz/survive_viewer.js @@ -185,6 +185,29 @@ function create_tracked_object(info) { scene.add(group); } +var trails; +var MAX_LINE_POINTS = 1000; +$(function() { + $("#trails").change(function() { + if (this.checked) { + var geometry = new THREE.Geometry(); + var material = new THREE.LineBasicMaterial({color : 0x305ea8}); + + for (i = 0; i < MAX_LINE_POINTS; i++) { + geometry.vertices.push(new THREE.Vector3(0, 0, 0)); + } + geometry.dynamic = true; + + trails = new THREE.Line(geometry, material); + + scene.add(trails); + } else { + if (trails) + scene.remove(trails); + } + }); +}); + var survive_log_handlers = { "LH_POSE" : function(v) { var obj = { @@ -214,6 +237,14 @@ var survive_log_handlers = { objs[obj.tracker].quaternion.set(obj.quat[1], obj.quat[2], obj.quat[3], obj.quat[0]); objs[obj.tracker].verticesNeedUpdate = true; timecode[obj.tracker] = obj.timecode; + + if (trails) { + + trails.geometry.vertices.push(trails.geometry.vertices.shift()); // shift the array + trails.geometry.vertices[MAX_LINE_POINTS - 1] = + new THREE.Vector3(obj.position[0], obj.position[1], obj.position[2]); + trails.geometry.verticesNeedUpdate = true; + } } }, "CONFIG" : function(v, tracker) { -- cgit v1.2.3 From 0d323e4a42bcfa70150c77f45f6f465f84666e31 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sat, 24 Mar 2018 09:50:40 -0600 Subject: Made playback / record process raw light data --- src/poser.c | 6 ++++- src/survive_disambiguator.c | 3 +++ src/survive_playback.c | 55 ++++++++++++++++++++++++++++++++++++++++----- src/survive_playback.h | 2 +- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/poser.c b/src/poser.c index 3fb4fe8..2cfe28d 100644 --- a/src/poser.c +++ b/src/poser.c @@ -45,7 +45,11 @@ void PoserData_lighthouse_pose_func(PoserData *poser_data, SurviveObject *so, ui // Now find the space with the same origin, but rotated so that gravity is up SurvivePose lighthouse2objUp = {}, object2objUp = {}; - quatfrom2vectors(object2objUp.Rot, so->activations.accel, up); + if (quatmagnitude(so->activations.accel)) { + quatfrom2vectors(object2objUp.Rot, so->activations.accel, up); + } else { + object2objUp.Rot[0] = 1.0; + } // Calculate the pose of the lighthouse in this space ApplyPoseToPose(&lighthouse2objUp, &object2objUp, &lighthouse2obj); diff --git a/src/survive_disambiguator.c b/src/survive_disambiguator.c index cf89068..6c19475 100644 --- a/src/survive_disambiguator.c +++ b/src/survive_disambiguator.c @@ -1,11 +1,14 @@ #include "survive.h" + #include #include +#include "survive_playback.h" //#define LOG_LIGHTDATA void handle_lightcap(SurviveObject *so, LightcapElement *le) { + survive_recording_lightcap(so, le); #ifdef LOG_LIGHTDATA static FILE * flog; static double start = 0; diff --git a/src/survive_playback.c b/src/survive_playback.c index 9261bb5..172614b 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -16,6 +16,7 @@ typedef struct SurviveRecordingData { bool alwaysWriteStdOut; + bool writeRawLight; FILE *output_file; } SurviveRecordingData; @@ -96,6 +97,16 @@ void survive_recording_angle_process(struct SurviveObject *so, int sensor_id, in angle, lh); } +void survive_recording_lightcap(SurviveObject *so, LightcapElement *le) { + SurviveRecordingData *recordingData = so->ctx->recptr; + if (recordingData == 0) + return; + + if (recordingData->writeRawLight) { + write_to_output(recordingData, "%s C %d %u %u\n", so->codename, le->sensor_id, le->timestamp, le->length); + } +} + void survive_recording_light_process(struct SurviveObject *so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, uint32_t lh) { SurviveRecordingData *recordingData = so->ctx->recptr; @@ -133,6 +144,7 @@ void survive_recording_light_process(struct SurviveObject *so, int sensor_id, in LH_Axis = "Y"; break; } + write_to_output(recordingData, "%s %s %s %d %d %d %u %u %u\n", so->codename, LH_ID, LH_Axis, sensor_id, acode, timeinsweep, timecode, length, lh); } @@ -154,6 +166,7 @@ struct SurvivePlaybackData { FLT time_factor; double next_time_us; + bool hasRawLight; }; typedef struct SurvivePlaybackData SurvivePlaybackData; @@ -190,8 +203,31 @@ static int parse_and_run_imu(const char *line, SurvivePlaybackData *driver) { return 0; } -static int parse_and_run_lightcode(const char *line, - SurvivePlaybackData *driver) { +static int parse_and_run_rawlight(const char *line, SurvivePlaybackData *driver) { + driver->hasRawLight = 1; + + char dev[10]; + char op[10]; + LightcapElement le; + int rr = sscanf(line, "%s %s %hhu %u %hu\n", dev, op, &le.sensor_id, &le.timestamp, &le.length); + + SurviveObject *so = survive_get_so_by_name(driver->ctx, dev); + if (!so) { + static bool display_once = false; + SurviveContext *ctx = driver->ctx; + if (display_once == false) { + SV_ERROR("Could not find device named %s from lineno %d\n", dev, driver->lineno); + } + display_once = true; + + return -1; + } + + handle_lightcap(so, &le); + return 0; +} + +static int parse_and_run_lightcode(const char *line, SurvivePlaybackData *driver) { char lhn[10]; char axn[10]; char dev[10]; @@ -206,8 +242,7 @@ static int parse_and_run_lightcode(const char *line, &length, &lh); if (rr != 9) { - fprintf(stderr, "Warning: On line %d, only %d values read: '%s'\n", - driver->lineno, rr, line); + fprintf(stderr, "Warning: On line %d, only %d values read: '%s'\n", driver->lineno, rr, line); return -1; } @@ -263,13 +298,19 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { char dev[10]; char op[10]; - if (sscanf(line, "%8s %8s", dev, op) < 2) + if (sscanf(line, "%8s %8s", dev, op) < 2) { + free(line); return 0; + } - if ((op[0] != 'R' && op[0] != 'L' && op[0] != 'I') || op[1] != 0) + if (op[1] != 0) { return 0; + } switch (op[0]) { + case 'C': + parse_and_run_rawlight(line, driver); + break; case 'L': case 'R': parse_and_run_lightcode(line, driver); @@ -319,6 +360,8 @@ void survive_install_recording(SurviveContext *ctx) { if (record_to_stdout) { SV_INFO("Recording to stdout"); } + + ctx->recptr->writeRawLight = survive_configi(ctx, "record-rawlight", SC_GET, 1); } } diff --git a/src/survive_playback.h b/src/survive_playback.h index 52638a9..c895120 100644 --- a/src/survive_playback.h +++ b/src/survive_playback.h @@ -5,7 +5,7 @@ void survive_recording_config_process(SurviveObject *so, char *ct0conf, int len) void survive_recording_lighthouse_process(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *lh_pose, SurvivePose *obj); - +void survive_recording_lightcap(SurviveObject *so, LightcapElement *le); void survive_recording_raw_pose_process(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose); void survive_recording_info_process(SurviveContext *ctx, const char *fault); void survive_recording_angle_process(struct SurviveObject *so, int sensor_id, int acode, uint32_t timecode, FLT length, -- cgit v1.2.3 From b45e58d9f75747e8727ac6cd0594a921e945c7e2 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sat, 24 Mar 2018 10:03:43 -0600 Subject: Fixed issue(s) which would write to the config file when it wasn't needed --- data_recorder.c | 2 +- src/survive_playback.c | 8 ++++---- src/survive_vive.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data_recorder.c b/data_recorder.c index 427a953..968ae17 100644 --- a/data_recorder.c +++ b/data_recorder.c @@ -11,7 +11,7 @@ int main(int argc, char **argv) { if (ctx == 0) // implies -help or similiar return 0; - const char *dataout_file = survive_configs(ctx, "record", SC_SETCONFIG, ""); + const char *dataout_file = survive_configs(ctx, "record", SC_GET, ""); if (strlen(dataout_file) == 0) { survive_configi(ctx, "record-stdout", SC_SET | SC_OVERRIDE, 1); } diff --git a/src/survive_playback.c b/src/survive_playback.c index 172614b..e4321bc 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -342,8 +342,8 @@ static int playback_close(struct SurviveContext *ctx, void *_driver) { } void survive_install_recording(SurviveContext *ctx) { - const char *dataout_file = survive_configs(ctx, "record", SC_SETCONFIG, ""); - int record_to_stdout = survive_configi(ctx, "record-stdout", SC_SETCONFIG, 0); + const char *dataout_file = survive_configs(ctx, "record", SC_GET, ""); + int record_to_stdout = survive_configi(ctx, "record-stdout", SC_GET, 0); if (strlen(dataout_file) > 0 || record_to_stdout) { ctx->recptr = calloc(1, sizeof(struct SurviveRecordingData)); @@ -366,7 +366,7 @@ void survive_install_recording(SurviveContext *ctx) { } int DriverRegPlayback(SurviveContext *ctx) { - const char *playback_file = survive_configs(ctx, "playback", SC_SETCONFIG, ""); + const char *playback_file = survive_configs(ctx, "playback", SC_GET, ""); if (strlen(playback_file) == 0) { return 0; @@ -375,7 +375,7 @@ int DriverRegPlayback(SurviveContext *ctx) { SurvivePlaybackData *sp = calloc(1, sizeof(SurvivePlaybackData)); sp->ctx = ctx; sp->playback_dir = playback_file; - sp->time_factor = survive_configf(ctx, "playback-factor", SC_SETCONFIG, 1.f); + sp->time_factor = survive_configf(ctx, "playback-factor", SC_GET, 1.f); printf("%s\n", playback_file); diff --git a/src/survive_vive.c b/src/survive_vive.c index d431207..91f25af 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -1720,7 +1720,7 @@ void init_SurviveObject(SurviveObject* so) { int DriverRegHTCVive( SurviveContext * ctx ) { - const char *playback_dir = survive_configs(ctx, "playback", SC_SETCONFIG, ""); + const char *playback_dir = survive_configs(ctx, "playback", SC_GET, ""); if(strlen(playback_dir) != 0) { SV_INFO("Playback is active; disabling USB driver"); return 0; -- cgit v1.2.3 From d5c42c4951261c401c5f9148ce2d6bb1402ce75b Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sat, 24 Mar 2018 10:13:23 -0600 Subject: Some minor fixups around command line processing --- calibrate.c | 11 +++++++---- calibrate_client.c | 3 +++ include/libsurvive/survive.h | 15 +++++++++++---- simple_pose_test.c | 3 +++ src/survive.c | 5 ++++- test.c | 3 +++ 6 files changed, 31 insertions(+), 9 deletions(-) diff --git a/calibrate.c b/calibrate.c index e0426f7..569c5cb 100644 --- a/calibrate.c +++ b/calibrate.c @@ -393,9 +393,6 @@ char * const * gargv; void * SurviveThread(void *jnk) { - ctx = survive_init( gargc, gargv ); - - uint8_t i =0; for (i=0;i<32;++i) { sensor_name[i] = malloc(3); @@ -433,8 +430,14 @@ int main( int argc, char ** argv ) { gargc = argc; gargv = argv; + + ctx = survive_init(gargc, gargv); + if (ctx == 0) { // Implies --help or similiar + return -1; + } + // Create the survive thread - OGCreateThread( SurviveThread, 0 ); + OGCreateThread(SurviveThread, 0); // Wait for the survive thread to load while(!SurviveThreadLoaded){ OGUSleep(100); } diff --git a/calibrate_client.c b/calibrate_client.c index 43ab821..4471acf 100644 --- a/calibrate_client.c +++ b/calibrate_client.c @@ -162,6 +162,9 @@ int main( int argc, char ** argv ) */ ctx = survive_init( argc, argv ); + if (ctx == 0) { // Implies --help or similiar + return -1; + } survive_install_light_fn( ctx, my_light_process ); survive_install_imu_fn( ctx, my_imu_process ); diff --git a/include/libsurvive/survive.h b/include/libsurvive/survive.h index 0b85bf3..b1c32cd 100644 --- a/include/libsurvive/survive.h +++ b/include/libsurvive/survive.h @@ -202,11 +202,18 @@ struct SurviveContext void survive_verify_FLT_size(uint32_t user_size); // Baked in size of FLT to verify users of the library have the correct setting. - - - - SurviveContext * survive_init_internal( int argc, char * const * argv ); + +/** + * Call survive_init to get a populated SurviveContext pointer. + * + * This also sets up a number of configuration values based on command line + * arguments. Pass 0, 0 to this function if you specifically do not want + * command line processing. + * + * Note that this function _can_ return null based on command line arguments, + * notably if -h was passed in. + */ static inline SurviveContext * survive_init( int argc, char * const * argv ) { survive_verify_FLT_size(sizeof(FLT)); diff --git a/simple_pose_test.c b/simple_pose_test.c index 34c15de..0772abb 100644 --- a/simple_pose_test.c +++ b/simple_pose_test.c @@ -158,6 +158,9 @@ int main( int argc, char ** argv ) double Start = OGGetAbsoluteTime(); ctx = survive_init( argc, argv ); + if (ctx == 0) { // Implies --help or similiar + return -1; + } //survive_install_button_fn(ctx, testprog_button_process); survive_install_raw_pose_fn(ctx, testprog_raw_pose_process); diff --git a/src/survive.c b/src/survive.c index 1786d45..807e82f 100644 --- a/src/survive.c +++ b/src/survive.c @@ -177,7 +177,10 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { fprintf(stderr, " -p [poser] - use a specific defaultposer.\n"); fprintf(stderr, " -l [lighthouse count] - use a specific number of lighthoses.\n"); fprintf(stderr, " -c [config file] - set config file\n"); - fprintf(stderr, " -p [lighthouse count] - use a specific number of lighthoses.\n"); + fprintf(stderr, " --record [log file] - Write all events to the given record file.\n"); + fprintf(stderr, " --playback [log file] - Read events from the given file instead of USB devices.\n"); + fprintf(stderr, " --playback-factor [f] - Time factor of playback -- 1 is run at the same timing as " + "original, 0 is run as fast as possible.\n"); return 0; } diff --git a/test.c b/test.c index 8e620bc..ad7aaa0 100644 --- a/test.c +++ b/test.c @@ -142,6 +142,9 @@ int main( int argc, char ** argv ) double Start = OGGetAbsoluteTime(); ctx = survive_init( argc, argv ); + if (ctx == 0) { // Implies --help or similiar + return -1; + } survive_install_button_fn(ctx, testprog_button_process); survive_install_raw_pose_fn(ctx, testprog_raw_pose_process); -- cgit v1.2.3 From c17ac29dcdb617f5d9d960e432a628747e0e63df Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sat, 24 Mar 2018 10:26:53 -0600 Subject: Added support for flags on command-line --- src/survive.c | 19 ++++++++++++++----- src/survive_playback.c | 4 +--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/survive.c b/src/survive.c index 807e82f..73d6474 100644 --- a/src/survive.c +++ b/src/survive.c @@ -159,11 +159,18 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { } if (vartoupdate) { - if (av + 1 == argvend) { - fprintf(stderr, "Error: expected parameter after %s\n", *av); - showhelp = 1; + const char *name = *av + 2; // Skip the '--'; + bool flagArgument = (av + 1 == argvend) || av[1][0] == '-'; + + if (flagArgument) { + bool value = strncmp("no-", name, 3) != 0; + if (value == 0) { + name += 3; // Skip "no-" + } + survive_configi(ctx, name, SC_OVERRIDE | SC_SET, value); } else { - survive_configs(ctx, *av + 2, SC_OVERRIDE | SC_SET, *(av + 1)); + const char *value = *(av + 1); + survive_configs(ctx, name, SC_OVERRIDE | SC_SET, value); av++; } } @@ -273,7 +280,7 @@ int survive_startup(SurviveContext *ctx) { ctx->state = SURVIVE_RUNNING; int calibrateMandatory = survive_configi(ctx, "calibrate", SC_GET, 0); - int calibrateForbidden = survive_configi(ctx, "no-calibrate", SC_GET, 0); + int calibrateForbidden = survive_configi(ctx, "calibrate", SC_GET, 1) == 0; if (calibrateMandatory && calibrateForbidden) { SV_INFO("Contradictory settings --calibrate and --no-calibrate specified. Switching to normal behavior."); calibrateMandatory = calibrateForbidden = 0; @@ -288,6 +295,8 @@ int survive_startup(SurviveContext *ctx) { if (!isCalibrated) { SV_INFO("Uncalibrated configuration detected. Attaching calibration. Please don't move tracked objects for " "the duration of calibration. Pass '--no-calibrate' to skip calibration"); + } else { + SV_INFO("Calibration requested. Previous calibration will be overwritten."); } bool doCalibrate = isCalibrated == false || calibrateMandatory; diff --git a/src/survive_playback.c b/src/survive_playback.c index e4321bc..dc9a330 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -350,7 +350,7 @@ void survive_install_recording(SurviveContext *ctx) { ctx->recptr->output_file = fopen(dataout_file, "w"); if (ctx->recptr->output_file == 0 && !record_to_stdout) { - SV_INFO("Could not open %s for writing\n", dataout_file); + SV_INFO("Could not open %s for writing", dataout_file); free(ctx->recptr); ctx->recptr = 0; return; @@ -377,8 +377,6 @@ int DriverRegPlayback(SurviveContext *ctx) { sp->playback_dir = playback_file; sp->time_factor = survive_configf(ctx, "playback-factor", SC_GET, 1.f); - printf("%s\n", playback_file); - sp->playback_file = fopen(playback_file, "r"); if (sp->playback_file == 0) { fprintf(stderr, "Could not open playback events file %s", -- cgit v1.2.3 From c47826bb1171083377309e356168b46cb3621df7 Mon Sep 17 00:00:00 2001 From: dpeter99 Date: Sun, 25 Mar 2018 21:06:27 +0200 Subject: Started the VS project update --- .gitignore | 1 + src/poser.c | 5 ++++- src/poser_charlesslow.c | 2 +- src/poser_daveortho.c | 2 +- src/poser_epnp.c | 4 ++-- src/poser_sba.c | 22 +++++++++++----------- src/poser_turveytori.c | 2 +- src/survive_cal.c | 2 +- src/survive_playback.c | 8 ++++---- winbuild/calibrate/calibrate.vcxproj | 1 + winbuild/libsurvive/libsurvive.vcxproj | 7 ++++++- winbuild/libsurvive/libsurvive.vcxproj.filters | 21 ++++++++++++++++++--- 12 files changed, 51 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index e5f098b..712fde2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ winbuild/calibrate/calinfo/* winbuild/calibrate/config.json winbuild/calibrate/x64/* winbuild/libsurvive/x64/* +winbuild/data_recorder/x64/* winbuild/.vs/* *.user *.ipch diff --git a/src/poser.c b/src/poser.c index 2cfe28d..1c638f8 100644 --- a/src/poser.c +++ b/src/poser.c @@ -3,6 +3,9 @@ #include #include +#define _USE_MATH_DEFINES // for C +#include + void PoserData_poser_raw_pose_func(PoserData *poser_data, SurviveObject *so, uint8_t lighthouse, SurvivePose *pose) { if (poser_data->rawposeproc) { poser_data->rawposeproc(so, lighthouse, pose, poser_data->userdata); @@ -44,7 +47,7 @@ void PoserData_lighthouse_pose_func(PoserData *poser_data, SurviveObject *so, ui ApplyPoseToPose(&lighthouse2obj, &arb2object, &lighthouse2arb); // Now find the space with the same origin, but rotated so that gravity is up - SurvivePose lighthouse2objUp = {}, object2objUp = {}; + SurvivePose lighthouse2objUp = {0}, object2objUp = {0}; if (quatmagnitude(so->activations.accel)) { quatfrom2vectors(object2objUp.Rot, so->activations.accel, up); } else { diff --git a/src/poser_charlesslow.c b/src/poser_charlesslow.c index c7d9033..bc6683a 100644 --- a/src/poser_charlesslow.c +++ b/src/poser_charlesslow.c @@ -53,7 +53,7 @@ int PoserCharlesSlow( SurviveObject * so, PoserData * pd ) printf( "%f %f %f\n", hmd_points[p*3+0], hmd_points[p*3+1], hmd_points[p*3+2] ); } - SurvivePose additionalTx = {}; + SurvivePose additionalTx = {0}; int lh, cycle; FLT dz, dy, dx; diff --git a/src/poser_daveortho.c b/src/poser_daveortho.c index c922b2e..c47bceb 100644 --- a/src/poser_daveortho.c +++ b/src/poser_daveortho.c @@ -127,7 +127,7 @@ int PoserDaveOrtho( SurviveObject * so, PoserData * pd ) PoserDataFullScene * fs = (PoserDataFullScene*)pd; int LH_ID; - SurvivePose alignLh0ToXAxis = {}; + SurvivePose alignLh0ToXAxis = {0}; for( LH_ID = 0; LH_ID < 2; LH_ID++ ) { int i; diff --git a/src/poser_epnp.c b/src/poser_epnp.c index 401ea2a..f5fa127 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -13,7 +13,7 @@ #include "stdio.h" static SurvivePose solve_correspondence(SurviveObject *so, epnp *pnp, bool cameraToWorld) { - SurvivePose rtn = {}; + SurvivePose rtn = {0}; // std::cerr << "Solving for " << cal_imagePoints.size() << " correspondents" << std::endl; if (pnp->number_of_correspondences <= 3) { SurviveContext *ctx = so->ctx; @@ -128,7 +128,7 @@ int PoserEPNP(SurviveObject *so, PoserData *pd) { SurvivePose pose = solve_correspondence(so, &pnp, false); - SurvivePose txPose = {}; + SurvivePose txPose = {0}; quatrotatevector(txPose.Pos, so->ctx->bsd[lh].Pose.Rot, pose.Pos); for (int i = 0; i < 3; i++) { txPose.Pos[i] += so->ctx->bsd[lh].Pose.Pos[i]; diff --git a/src/poser_sba.c b/src/poser_sba.c index c01cc61..a1fdea6 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -44,7 +44,7 @@ void metric_function(int j, int i, double *aj, double *xij, void *adata) { SurviveObject *so = ctx->so; SurvivePose obj2world = ctx->obj_pose; - FLT sensorInWorld[3] = {}; + FLT sensorInWorld[3] = {0}; ApplyPoseToPoint(sensorInWorld, &obj2world, &so->sensor_locations[i * 3]); survive_reproject_from_pose_with_config(so->ctx, &ctx->calibration_config, j, (SurvivePose *)aj, sensorInWorld, xij); @@ -210,7 +210,7 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config pdl->hdr.pt = hdr.pt; pdl->hdr.rawposeproc = sba_set_position; - sba_set_position_t locations = {}; + sba_set_position_t locations = {0}; pdl->hdr.userdata = &locations; driver(so, &pdl->hdr); pdl->hdr = hdr; @@ -226,8 +226,8 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config } } - double opts[SBA_OPTSSZ] = {}; - double info[SBA_INFOSZ] = {}; + double opts[SBA_OPTSSZ] = {0}; + double info[SBA_INFOSZ] = {0}; sba_context_single_sweep ctx = {.hdr = {options, &pdl->hdr, so}, .acode = acode, .lh = lh}; @@ -306,7 +306,7 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o pdl->hdr.pt = hdr.pt; pdl->hdr.rawposeproc = sba_set_position; - sba_set_position_t locations = {}; + sba_set_position_t locations = {0}; pdl->hdr.userdata = &locations; driver(so, &pdl->hdr); pdl->hdr = hdr; @@ -323,8 +323,8 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o } } - double opts[SBA_OPTSSZ] = {}; - double info[SBA_INFOSZ] = {}; + double opts[SBA_OPTSSZ] = {0}; + double info[SBA_INFOSZ] = {0}; sba_context ctx = {options, &pdl->hdr, so}; @@ -399,7 +399,7 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd } else { SV_INFO("Not using a seed poser for SBA; results will likely be way off"); for (int i = 0; i < 2; i++) { - so->ctx->bsd[i].Pose = (SurvivePose){}; + so->ctx->bsd[i].Pose = (SurvivePose){0}; so->ctx->bsd[i].Pose.Rot[0] = 1.; } } @@ -407,8 +407,8 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd // PoserCharlesSlow(so, (PoserData *)pdfs); } - double opts[SBA_OPTSSZ] = {}; - double info[SBA_INFOSZ] = {}; + double opts[SBA_OPTSSZ] = {0}; + double info[SBA_INFOSZ] = {0}; opts[0] = SBA_INIT_MU; opts[1] = SBA_STOP_THRESH; @@ -435,7 +435,7 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd info); // info if (status >= 0) { - SurvivePose additionalTx = {}; + SurvivePose additionalTx = {0}; PoserData_lighthouse_pose_func(&pdfs->hdr, so, 0, &additionalTx, &sbactx.camera_params[0], &sbactx.obj_pose); PoserData_lighthouse_pose_func(&pdfs->hdr, so, 1, &additionalTx, &sbactx.camera_params[1], &sbactx.obj_pose); } else { diff --git a/src/poser_turveytori.c b/src/poser_turveytori.c index 2d3f802..035fca7 100644 --- a/src/poser_turveytori.c +++ b/src/poser_turveytori.c @@ -1443,7 +1443,7 @@ static Point SolveForLighthouse(FLT posOut[3], FLT quatOut[4], TrackedObject *ob lighthousePose.Pos[1] = refinedEstimateGd.y; lighthousePose.Pos[2] = refinedEstimateGd.z; - SurvivePose assumedObj = {}; + SurvivePose assumedObj = {0}; FLT negZ[3] = {0, 0, 1}; quatfrom2vectors(assumedObj.Rot, toriData->down, negZ); diff --git a/src/survive_cal.c b/src/survive_cal.c index 218f5c1..25e43b9 100755 --- a/src/survive_cal.c +++ b/src/survive_cal.c @@ -599,7 +599,7 @@ static void handle_calibration( struct SurviveCalData *cd ) for( obj = 0; obj < cd->numPoseObjects; obj++ ) { int i, j; - PoserDataFullScene fsd = {}; + PoserDataFullScene fsd = {0}; fsd.hdr.pt = POSERDATA_FULL_SCENE; for( j = 0; j < NUM_LIGHTHOUSES; j++ ) for( i = 0; i < SENSORS_PER_OBJECT; i++ ) diff --git a/src/survive_playback.c b/src/survive_playback.c index dc9a330..de26f73 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -6,7 +6,7 @@ #include #include -#include +//#include #include "survive_config.h" #include "survive_default_devices.h" @@ -274,7 +274,7 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { if (driver->next_time_us == 0) { char *buffer; size_t n = 0; - ssize_t r = getdelim(&line, &n, ' ', f); + int r = getdelim(&line, &n, ' ', f); if (r <= 0) return 0; @@ -292,7 +292,7 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { char *buffer; size_t n = 0; - ssize_t r = getline(&line, &n, f); + int r = getline(&line, &n, f); if (r <= 0) return 0; @@ -397,7 +397,7 @@ int DriverRegPlayback(SurviveContext *ctx) { while (!feof(sp->playback_file) && !ferror(sp->playback_file)) { char *line = 0; size_t n; - ssize_t r = getline(&line, &n, sp->playback_file); + int r = getline(&line, &n, sp->playback_file); if (r <= 0) continue; diff --git a/winbuild/calibrate/calibrate.vcxproj b/winbuild/calibrate/calibrate.vcxproj index 7a62c14..4392e49 100644 --- a/winbuild/calibrate/calibrate.vcxproj +++ b/winbuild/calibrate/calibrate.vcxproj @@ -111,6 +111,7 @@ Disabled USE_DOUBLE;RUNTIME_SYMNUMX;HIDAPI;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\..\windows;..\..\include\libsurvive;..\..\redist;%(AdditionalIncludeDirectories) + true Console diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index 725243a..3ce9dd3 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -150,6 +150,7 @@ + @@ -157,11 +158,15 @@ + - + + + + diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index 4c8c3c5..e96e220 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -39,9 +39,6 @@ Source Files - - Source Files - Source Files @@ -93,6 +90,24 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + -- cgit v1.2.3 From 7b6361a55e47dace4b1cfe36d8dba00a96424ad5 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 13:15:59 -0600 Subject: Made playback work --- src/survive_playback.c | 16 ++- winbuild/getdelim.c | 149 +++++++++++++++++++++++++ winbuild/libsurvive/libsurvive.vcxproj | 2 + winbuild/libsurvive/libsurvive.vcxproj.filters | 6 + 4 files changed, 167 insertions(+), 6 deletions(-) create mode 100644 winbuild/getdelim.c diff --git a/src/survive_playback.c b/src/survive_playback.c index de26f73..43a3c0b 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -6,7 +6,6 @@ #include #include -//#include #include "survive_config.h" #include "survive_default_devices.h" @@ -14,6 +13,14 @@ #include "os_generic.h" #include "stdarg.h" +#ifdef _WIN32 +typedef long ssize_t; +#define SSIZE_MAX LONG_MAX + +ssize_t getdelim(char ** lineptr, size_t * n, int delimiter, FILE *stream); +ssize_t getline(char **lineptr, size_t * n, FILE *stream); +#endif + typedef struct SurviveRecordingData { bool alwaysWriteStdOut; bool writeRawLight; @@ -267,14 +274,12 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { FILE *f = driver->playback_file; if (f && !feof(f) && !ferror(f)) { - int i; driver->lineno++; char *line; if (driver->next_time_us == 0) { - char *buffer; size_t n = 0; - int r = getdelim(&line, &n, ' ', f); + ssize_t r = getdelim(&line, &n, ' ', f); if (r <= 0) return 0; @@ -290,9 +295,8 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { return 0; driver->next_time_us = 0; - char *buffer; size_t n = 0; - int r = getline(&line, &n, f); + ssize_t r = getline(&line, &n, f); if (r <= 0) return 0; diff --git a/winbuild/getdelim.c b/winbuild/getdelim.c new file mode 100644 index 0000000..ca808ab --- /dev/null +++ b/winbuild/getdelim.c @@ -0,0 +1,149 @@ +/* Implementations of the getdelim() and getline() functions from POSIX 2008, + just in case your libc doesn't have them. + + getdelim() reads from a stream until a specified delimiter is encountered. + getline() reads from a stream until a newline is encountered. + + See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html + + NOTE: It is always the caller's responsibility to free the line buffer, even + when an error occurs. + + Copyright (c) 2011 James E. Ingram + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + + +#include +#include +#include +#include + + +#if __STDC_VERSION__ >= 199901L +/* restrict is a keyword */ +#else +# define restrict +#endif + + +#ifndef _POSIX_SOURCE +typedef long ssize_t; +#define SSIZE_MAX LONG_MAX +#endif + + +ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delimiter, + FILE *restrict stream); +ssize_t getline(char **restrict lineptr, size_t *restrict n, + FILE *restrict stream); + + + +#define _GETDELIM_GROWBY 128 /* amount to grow line buffer by */ +#define _GETDELIM_MINLEN 4 /* minimum line buffer size */ + + +ssize_t getdelim(char **restrict lineptr, size_t *restrict n, int delimiter, + FILE *restrict stream) +{ + char *buf, *pos; + int c; + ssize_t bytes; + + if (lineptr == NULL || n == NULL) { + errno = EINVAL; + return -1; + } + if (stream == NULL) { + errno = EBADF; + return -1; + } + + /* resize (or allocate) the line buffer if necessary */ + buf = *lineptr; + if (buf == NULL || *n < _GETDELIM_MINLEN) { + buf = realloc(*lineptr, _GETDELIM_GROWBY); + if (buf == NULL) { + /* ENOMEM */ + return -1; + } + *n = _GETDELIM_GROWBY; + *lineptr = buf; + } + + /* read characters until delimiter is found, end of file is reached, or an + error occurs. */ + bytes = 0; + pos = buf; + while ((c = getc(stream)) != EOF) { + if (bytes + 1 >= SSIZE_MAX) { + errno = EOVERFLOW; + return -1; + } + bytes++; + if (bytes >= *n - 1) { + buf = realloc(*lineptr, *n + _GETDELIM_GROWBY); + if (buf == NULL) { + /* ENOMEM */ + return -1; + } + *n += _GETDELIM_GROWBY; + pos = buf + bytes - 1; + *lineptr = buf; + } + + *pos++ = (char) c; + if (c == delimiter) { + break; + } + } + + if (ferror(stream) || (feof(stream) && (bytes == 0))) { + /* EOF, or an error from getc(). */ + return -1; + } + + *pos = '\0'; + return bytes; +} + + +ssize_t getline(char **restrict lineptr, size_t *restrict n, + FILE *restrict stream) +{ + return getdelim(lineptr, n, '\n', stream); +} + + +#ifdef _TEST_GETDELIM + +/* TODO: this isn't a very extensive test. */ +int main(void) +{ + char *line = NULL; + size_t n = 0; + while (getline(&line, &n, stdin) > 0) { + printf("%s", line); + } + return 0; +} + +#endif diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index 3ce9dd3..bf1ae2d 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -163,12 +163,14 @@ + + diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index e96e220..d2dc6ba 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -108,6 +108,12 @@ Source Files + + Source Files + + + Source Files + -- cgit v1.2.3 From 9b13bad446be174e1727c151b73c3cbef7ba4698 Mon Sep 17 00:00:00 2001 From: jdavidberger Date: Sun, 25 Mar 2018 16:31:35 -0600 Subject: Update Makefile Made O3 default --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a6d139b..ac04d60 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all : lib data_recorder test calibrate calibrate_client simple_pose_test CC?=gcc -CFLAGS:=-Iinclude/libsurvive -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable +CFLAGS:=-Iinclude/libsurvive -fPIC -g -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable CFLAGS_RELEASE:=-Iinclude/libsurvive -fPIC -msse2 -ftree-vectorize -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm -- cgit v1.2.3 From 2522e65f844d464dab7b5910d8183c3ad8ac922c Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 12:38:28 -0600 Subject: Fixed typo in linmath --- redist/linmath.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redist/linmath.h b/redist/linmath.h index cacb1c6..5d5bed2 100644 --- a/redist/linmath.h +++ b/redist/linmath.h @@ -49,7 +49,7 @@ typedef FLT LinmathQuat[4]; // This is the [wxyz] quaternion, in wxyz format. typedef FLT LinmathPoint3d[3]; -typedef FLT linmathVec3d[3]; +typedef FLT LinmathVec3d[3]; typedef struct LinmathPose { LinmathPoint3d Pos; -- cgit v1.2.3 From 2dfd1ed1027e94b73048299b0cb8300694832a7c Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 12:38:48 -0600 Subject: Added normals to viz --- tools/viz/survive_viewer.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tools/viz/survive_viewer.js b/tools/viz/survive_viewer.js index 70aecfa..df10ec3 100644 --- a/tools/viz/survive_viewer.js +++ b/tools/viz/survive_viewer.js @@ -164,16 +164,20 @@ function create_tracked_object(info) { group.sensors = []; if (info.config && info.config.lighthouse_config) { for (var idx in info.config.lighthouse_config.modelPoints) { - var p = info.config.lighthouse_config.modelPoints[idx]; - var color = 0xFFFFFF; // / info.points.length * idx; - if (idx === 10) + var p = info.config.lighthouse_config.modelPoints[idx]; + var pn = info.config.lighthouse_config.modelNormals[idx]; + var color = idx / info.config.lighthouse_config.modelPoints * 0xFFFFFF; + if (idx === 6) color = 0x00ff00; - if (idx === 12) - color = 0x0000ff; var sensorMaterial = new THREE.MeshBasicMaterial({color : color}); var newSensor = new THREE.Mesh(sensorGeometry, sensorMaterial); newSensor.position.set(p[0], p[1], p[2]); + var normalGeom = new THREE.Geometry(); + normalGeom.vertices.push(newSensor.position, + new THREE.Vector3(p[0] + pn[0] * .02, p[1] + pn[1] * .02, p[2] + pn[2] * .02)); + var normal= new THREE.Line(normalGeom, new THREE.LineBasicMaterial({color : idx == 6 ? 0xFF0000 : 0x00FF00})); + group.add(normal); group.sensors[idx] = sensorMaterial; group.add(newSensor); } @@ -296,7 +300,7 @@ var survive_log_handlers = { downAxes[obj.tracker] = new THREE.Geometry(); downAxes[obj.tracker].vertices.push(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, 0)); - var line = new THREE.Line(downAxes[obj.tracker], new THREE.LineBasicMaterial({color : 0xffffff})); + var line = new THREE.Line(downAxes[obj.tracker], new THREE.LineBasicMaterial({color : 0xffffff})); scene.add(line); } -- cgit v1.2.3 From 287fc6886057e1773d572b2058222b38fd11122f Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 21:19:05 -0600 Subject: Fixed out of array stepping in charles-biguator --- src/survive_charlesbiguator.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/survive_charlesbiguator.c b/src/survive_charlesbiguator.c index fbba888..83b3681 100644 --- a/src/survive_charlesbiguator.c +++ b/src/survive_charlesbiguator.c @@ -1,6 +1,7 @@ //<>< (C) 2016 C. N. Lohr, MOSTLY Under MIT/x11 License. // #include "survive_internal.h" +#include #include /* for sqrt */ #include #include @@ -15,12 +16,16 @@ static int32_t decode_acode(uint32_t length, int32_t main_divisor) { if (acode & 1) return -1; - return (acode >> 1) - 6; + int32_t rtn = (acode >> 1) - 6; + if (rtn > 7 || rtn < 0) { + return -1; + } + return rtn; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////The charles disambiguator. Don't use this, mostly here for -///debugging./////////////////////////////////////////////////////// +/// debugging./////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static void HandleOOTX(SurviveContext *ctx, SurviveObject *so) { @@ -169,21 +174,23 @@ void DisambiguatorCharles(SurviveObject *so, LightcapElement *le) { int32_t main_divisor = so->timebase_hz / 384000; // 125 @ 48 MHz. int acode = decode_acode(so->last_sync_length[0], main_divisor); - int whichlh; - if (acode < 0) - whichlh = 1; - else - whichlh = (acode >> 2); - int32_t dl = so->last_sync_time[whichlh]; - if (!so->did_handle_ootx) - HandleOOTX(ctx, so); + // If acode isn't right; don't even think of emitting an event + if (acode >= 0) { + int whichlh = (acode >> 2); + assert(whichlh <= 1); + int32_t dl = so->last_sync_time[whichlh]; - int32_t offset_from = le->timestamp - dl + le->length / 2; + if (!so->did_handle_ootx) + HandleOOTX(ctx, so); - // Make sure pulse is in valid window - if (offset_from < so->timecenter_ticks * 2 - so->pulse_in_clear_time && offset_from > so->pulse_in_clear_time) { - ctx->lightproc(so, le->sensor_id, acode, offset_from, le->timestamp, le->length, whichlh); + int32_t offset_from = le->timestamp - dl + le->length / 2; + + // Make sure pulse is in valid window + if (offset_from < so->timecenter_ticks * 2 - so->pulse_in_clear_time && + offset_from > so->pulse_in_clear_time) { + ctx->lightproc(so, le->sensor_id, acode, offset_from, le->timestamp, le->length, whichlh); + } } } else { // printf( "FAIL %d %d - %d = %d\n", le->length, so->last_photo_time, le->timestamp, so->last_photo_time - -- cgit v1.2.3 From 801e17d2c52c21adad5eff63265c1aaea2255b1b Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 21:22:01 -0600 Subject: Added additional parameters to EPNP and SBA, made it so that degenerate poses didn't occur as easily in EPNP --- src/poser_epnp.c | 16 ++++++++++++++-- src/poser_sba.c | 25 ++++++++++++++++--------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/poser_epnp.c b/src/poser_epnp.c index 401ea2a..ea1e735 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -27,6 +27,12 @@ static SurvivePose solve_correspondence(SurviveObject *so, epnp *pnp, bool camer CvMat R = cvMat(3, 3, CV_64F, r); CvMat T = cvMat(3, 1, CV_64F, rtn.Pos); + + // Super degenerate inputs will project us basically right in the camera. Detect and reject + if (magnitude3d(rtn.Pos) < 0.25) { + return rtn; + } + // Requested output is camera -> world, so invert if (cameraToWorld) { FLT tmp[3]; @@ -81,7 +87,10 @@ static int opencv_solver_fullscene(SurviveObject *so, PoserDataFullScene *pdfs) } SurvivePose lighthouse2object = solve_correspondence(so, &pnp, true); - PoserData_lighthouse_pose_func(&pdfs->hdr, so, lh, &additionalTx, &lighthouse2object, 0); + + if (quatmagnitude(lighthouse2object.Rot) != 0.0) { + PoserData_lighthouse_pose_func(&pdfs->hdr, so, lh, &additionalTx, &lighthouse2object, 0); + } epnp_dtor(&pnp); } @@ -123,8 +132,11 @@ int PoserEPNP(SurviveObject *so, PoserData *pd) { epnp_set_maximum_number_of_correspondences(&pnp, so->sensor_ct); add_correspondences(so, &pnp, scene, lightData); + static int required_meas = -1; + if (required_meas == -1) + required_meas = survive_configi(so->ctx, "epnp-required-meas", SC_GET, 4); - if (pnp.number_of_correspondences > 4) { + if (pnp.number_of_correspondences > required_meas) { SurvivePose pose = solve_correspondence(so, &pnp, false); diff --git a/src/poser_sba.c b/src/poser_sba.c index c01cc61..226f387 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -37,6 +37,9 @@ typedef struct SBAData { int failures_to_reset_cntr; int successes_to_reset; int successes_to_reset_cntr; + + int required_meas; + } SBAData; void metric_function(int j, int i, double *aj, double *xij, void *adata) { @@ -175,7 +178,7 @@ void str_metric_function(int j, int i, double *bi, double *xij, void *adata) { SurvivePose *camera = &so->ctx->bsd[lh].Pose; survive_reproject_from_pose_with_config(so->ctx, &ctx->calibration_config, lh, camera, xyz, xij); } - +#if 0 static double run_sba_find_3d_structure_single_sweep(survive_calibration_config options, PoserDataLight *pdl, SurviveObject *so, SurviveSensorActivations *scene, int acode, int lh, int max_iterations /* = 50*/, @@ -187,7 +190,7 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config size_t meas_size = construct_input_from_scene_single_sweep(so, pdl, scene, vmask, meas, acode, lh); static int failure_count = 500; - if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < 8) { + if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < d->required_meas) { if (so->ctx->bsd[0].PositionSet && so->ctx->bsd[1].PositionSet && failure_count++ == 500) { SurviveContext *ctx = so->ctx; SV_INFO("Can't solve for position with just %u measurements", (unsigned int)meas_size); @@ -261,7 +264,7 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config SurviveContext *ctx = so->ctx; // Docs say info[0] should be divided by meas; I don't buy it really... static int cnt = 0; - if (cnt++ > 1000 || meas_size < 8) { + if (cnt++ > 1000 || meas_size < d->required_meas) { SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (unsigned int)meas_size); SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); cnt = 0; @@ -270,7 +273,7 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config return info[1] / meas_size * 2; } - +#endif static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config options, PoserDataLight *pdl, SurviveObject *so, SurviveSensorActivations *scene, int max_iterations /* = 50*/, double max_reproj_error /* = 0.005*/) { @@ -281,7 +284,7 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o size_t meas_size = construct_input_from_scene(so, pdl, scene, vmask, meas); static int failure_count = 500; - if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < 7) { + if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < d->required_meas) { if (so->ctx->bsd[0].PositionSet && so->ctx->bsd[1].PositionSet && failure_count++ == 500) { SurviveContext *ctx = so->ctx; SV_INFO("Can't solve for position with just %u measurements", (unsigned int)meas_size); @@ -361,7 +364,7 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o SurviveContext *ctx = so->ctx; // Docs say info[0] should be divided by meas; I don't buy it really... static int cnt = 0; - if (cnt++ > 1000 || meas_size < 8) { + if (cnt++ > 1000 || meas_size < d->required_meas) { SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (int)meas_size); SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); cnt = 0; @@ -456,16 +459,20 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd } int PoserSBA(SurviveObject *so, PoserData *pd) { + SurviveContext *ctx = so->ctx; if (so->PoserData == 0) { so->PoserData = calloc(1, sizeof(SBAData)); SBAData *d = so->PoserData; d->failures_to_reset_cntr = 0; - d->failures_to_reset = 5; + d->failures_to_reset = survive_configi(ctx, "sba-failures-to-reset", SC_GET, 1); d->successes_to_reset_cntr = 0; - d->successes_to_reset = 20; + d->successes_to_reset = survive_configi(ctx, "sba-successes-to-reset", SC_GET, 1); + + d->required_meas = survive_configi(ctx, "sba-required-meas", SC_GET, 8); + + SV_INFO("Initializing SBA with %d required measurements", d->required_meas); } SBAData *d = so->PoserData; - SurviveContext *ctx = so->ctx; switch (pd->pt) { case POSERDATA_LIGHT: { // No poses if calibration is ongoing -- cgit v1.2.3 From 005713cf133df85f208ff0cb2117a6855b85a5a7 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 21:22:53 -0600 Subject: Added PoseToMatrix function for debugability --- redist/linmath.c | 339 ++++++++++++++++++++++++++----------------------------- redist/linmath.h | 69 ++++++----- 2 files changed, 189 insertions(+), 219 deletions(-) diff --git a/redist/linmath.c b/redist/linmath.c index d005074..c57410f 100644 --- a/redist/linmath.c +++ b/redist/linmath.c @@ -1,130 +1,120 @@ -//Copyright 2013,2016 <>< C. N. Lohr. This file licensed under the terms of the MIT license. +// Copyright 2013,2016 <>< C. N. Lohr. This file licensed under the terms of the MIT license. -#include #include "linmath.h" #include +#include #include -void cross3d( FLT * out, const FLT * a, const FLT * b ) -{ - out[0] = a[1]*b[2] - a[2]*b[1]; - out[1] = a[2]*b[0] - a[0]*b[2]; - out[2] = a[0]*b[1] - a[1]*b[0]; +void cross3d(FLT *out, const FLT *a, const FLT *b) { + out[0] = a[1] * b[2] - a[2] * b[1]; + out[1] = a[2] * b[0] - a[0] * b[2]; + out[2] = a[0] * b[1] - a[1] * b[0]; } -void sub3d( FLT * out, const FLT * a, const FLT * b ) -{ +void sub3d(FLT *out, const FLT *a, const FLT *b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; } -void add3d( FLT * out, const FLT * a, const FLT * b ) -{ +void add3d(FLT *out, const FLT *a, const FLT *b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; } -void scale3d( FLT * out, const FLT * a, FLT scalar ) -{ +void scale3d(FLT *out, const FLT *a, FLT scalar) { out[0] = a[0] * scalar; out[1] = a[1] * scalar; out[2] = a[2] * scalar; } -void normalize3d( FLT * out, const FLT * in ) -{ +void normalize3d(FLT *out, const FLT *in) { FLT r = ((FLT)1.) / FLT_SQRT(in[0] * in[0] + in[1] * in[1] + in[2] * in[2]); out[0] = in[0] * r; out[1] = in[1] * r; out[2] = in[2] * r; } -FLT dot3d( const FLT * a, const FLT * b ) -{ - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -} - -int compare3d( const FLT * a, const FLT * b, FLT epsilon ) -{ - if( !a || !b ) return 0; - if( a[2] - b[2] > epsilon ) return 1; - if( b[2] - a[2] > epsilon ) return -1; - if( a[1] - b[1] > epsilon ) return 1; - if( b[1] - a[1] > epsilon ) return -1; - if( a[0] - b[0] > epsilon ) return 1; - if( b[0] - a[0] > epsilon ) return -1; +FLT dot3d(const FLT *a, const FLT *b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } + +int compare3d(const FLT *a, const FLT *b, FLT epsilon) { + if (!a || !b) + return 0; + if (a[2] - b[2] > epsilon) + return 1; + if (b[2] - a[2] > epsilon) + return -1; + if (a[1] - b[1] > epsilon) + return 1; + if (b[1] - a[1] > epsilon) + return -1; + if (a[0] - b[0] > epsilon) + return 1; + if (b[0] - a[0] > epsilon) + return -1; return 0; } -void copy3d( FLT * out, const FLT * in ) -{ +void copy3d(FLT *out, const FLT *in) { out[0] = in[0]; out[1] = in[1]; out[2] = in[2]; } -FLT magnitude3d(const FLT * a ) -{ - return FLT_SQRT(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); -} +FLT magnitude3d(const FLT *a) { return FLT_SQRT(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); } -FLT anglebetween3d( FLT * a, FLT * b ) -{ +FLT anglebetween3d(FLT *a, FLT *b) { FLT an[3]; FLT bn[3]; - normalize3d( an, a ); - normalize3d( bn, b ); + normalize3d(an, a); + normalize3d(bn, b); FLT dot = dot3d(an, bn); - if( dot < -0.9999999 ) return LINMATHPI; - if( dot > 0.9999999 ) return 0; + if (dot < -0.9999999) + return LINMATHPI; + if (dot > 0.9999999) + return 0; return FLT_ACOS(dot); } // algorithm found here: http://inside.mines.edu/fs_home/gmurray/ArbitraryAxisRotation/ -void rotatearoundaxis(FLT *outvec3, FLT *invec3, FLT *axis, FLT angle) -{ +void rotatearoundaxis(FLT *outvec3, FLT *invec3, FLT *axis, FLT angle) { // TODO: this really should be external. normalize3d(axis, axis); FLT s = FLT_SIN(angle); FLT c = FLT_COS(angle); - FLT u=axis[0]; - FLT v=axis[1]; - FLT w=axis[2]; + FLT u = axis[0]; + FLT v = axis[1]; + FLT w = axis[2]; - FLT x=invec3[0]; - FLT y=invec3[1]; - FLT z=invec3[2]; + FLT x = invec3[0]; + FLT y = invec3[1]; + FLT z = invec3[2]; - outvec3[0] = u*(u*x + v*y + w*z)*(1-c) + x*c + (-w*y + v*z)*s; - outvec3[1] = v*(u*x + v*y + w*z)*(1-c) + y*c + ( w*x - u*z)*s; - outvec3[2] = w*(u*x + v*y + w*z)*(1-c) + z*c + (-v*x + u*y)*s; + outvec3[0] = u * (u * x + v * y + w * z) * (1 - c) + x * c + (-w * y + v * z) * s; + outvec3[1] = v * (u * x + v * y + w * z) * (1 - c) + y * c + (w * x - u * z) * s; + outvec3[2] = w * (u * x + v * y + w * z) * (1 - c) + z * c + (-v * x + u * y) * s; } -void angleaxisfrom2vect(FLT *angle, FLT *axis, FLT *src, FLT *dest) -{ +void angleaxisfrom2vect(FLT *angle, FLT *axis, FLT *src, FLT *dest) { FLT v0[3]; FLT v1[3]; normalize3d(v0, src); normalize3d(v1, dest); - FLT d = dot3d(v0, v1);// v0.dotProduct(v1); + FLT d = dot3d(v0, v1); // v0.dotProduct(v1); // If dot == 1, vectors are the same // If dot == -1, vectors are opposite - if (FLT_FABS(d - 1) < DEFAULT_EPSILON) - { + if (FLT_FABS(d - 1) < DEFAULT_EPSILON) { axis[0] = 0; axis[1] = 1; axis[2] = 0; *angle = 0; return; - } - else if (FLT_FABS(d + 1) < DEFAULT_EPSILON) - { + } else if (FLT_FABS(d + 1) < DEFAULT_EPSILON) { axis[0] = 0; axis[1] = 1; axis[2] = 0; @@ -137,33 +127,28 @@ void angleaxisfrom2vect(FLT *angle, FLT *axis, FLT *src, FLT *dest) *angle = FLT_ACOS(d / (v0Len * v1Len)); - //cross3d(c, v0, v1); + // cross3d(c, v0, v1); cross3d(axis, v1, v0); - } - -void axisanglefromquat(FLT *angle, FLT *axis, FLT *q) -{ +void axisanglefromquat(FLT *angle, FLT *axis, FLT *q) { // this way might be fine, too. - //FLT dist = FLT_SQRT((q[1] * q[1]) + (q[2] * q[2]) + (q[3] * q[3])); + // FLT dist = FLT_SQRT((q[1] * q[1]) + (q[2] * q[2]) + (q[3] * q[3])); // //*angle = 2 * FLT_ATAN2(dist, q[0]); - //axis[0] = q[1] / dist; - //axis[1] = q[2] / dist; - //axis[2] = q[3] / dist; - + // axis[0] = q[1] / dist; + // axis[1] = q[2] / dist; + // axis[2] = q[3] / dist; // Good mathematical foundation for this algorithm found here: // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm - FLT tmp[4] = { q[0], q[1], q[2], q[3] }; + FLT tmp[4] = {q[0], q[1], q[2], q[3]}; quatnormalize(tmp, q); - if (FLT_FABS(q[0] - 1) < FLT_EPSILON) - { + if (FLT_FABS(q[0] - 1) < FLT_EPSILON) { // we have a degenerate case where we're rotating approx. 0 degrees *angle = 0; axis[0] = 1; @@ -180,11 +165,14 @@ void axisanglefromquat(FLT *angle, FLT *axis, FLT *q) } /////////////////////////////////////QUATERNIONS////////////////////////////////////////// -//Originally from Mercury (Copyright (C) 2009 by Joshua Allen, Charles Lohr, Adam Lowman) -//Under the mit/X11 license. +// Originally from Mercury (Copyright (C) 2009 by Joshua Allen, Charles Lohr, Adam Lowman) +// Under the mit/X11 license. void quatsetnone(LinmathQuat q) { - q[0] = 1; q[1] = 0; q[2] = 0; q[3] = 0; + q[0] = 1; + q[1] = 0; + q[2] = 0; + q[3] = 0; } void quatcopy(LinmathQuat qout, const LinmathQuat qin) { @@ -195,9 +183,9 @@ void quatcopy(LinmathQuat qout, const LinmathQuat qin) { } void quatfromeuler(LinmathQuat q, const LinmathEulerAngle euler) { - FLT X = euler[0]/2.0f; //roll - FLT Y = euler[1]/2.0f; //pitch - FLT Z = euler[2]/2.0f; //yaw + FLT X = euler[0] / 2.0f; // roll + FLT Y = euler[1] / 2.0f; // pitch + FLT Z = euler[2] / 2.0f; // yaw FLT cx = FLT_COS(X); FLT sx = FLT_SIN(X); @@ -206,17 +194,17 @@ void quatfromeuler(LinmathQuat q, const LinmathEulerAngle euler) { FLT cz = FLT_COS(Z); FLT sz = FLT_SIN(Z); - //Correct according to - //http://en.wikipedia.org/wiki/Conversion_between_MQuaternions_and_Euler_angles - q[0] = cx*cy*cz+sx*sy*sz;//q1 - q[1] = sx*cy*cz-cx*sy*sz;//q2 - q[2] = cx*sy*cz+sx*cy*sz;//q3 - q[3] = cx*cy*sz-sx*sy*cz;//q4 - quatnormalize( q, q ); + // Correct according to + // http://en.wikipedia.org/wiki/Conversion_between_MQuaternions_and_Euler_angles + q[0] = cx * cy * cz + sx * sy * sz; // q1 + q[1] = sx * cy * cz - cx * sy * sz; // q2 + q[2] = cx * sy * cz + sx * cy * sz; // q3 + q[3] = cx * cy * sz - sx * sy * cz; // q4 + quatnormalize(q, q); } void quattoeuler(LinmathEulerAngle euler, const LinmathQuat q) { - //According to http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles (Oct 26, 2009) + // According to http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles (Oct 26, 2009) euler[0] = FLT_ATAN2(2 * (q[0] * q[1] + q[2] * q[3]), 1 - 2 * (q[1] * q[1] + q[2] * q[2])); euler[1] = FLT_ASIN(2 * (q[0] * q[2] - q[3] * q[1])); euler[2] = FLT_ATAN2(2 * (q[0] * q[3] + q[1] * q[2]), 1 - 2 * (q[2] * q[2] + q[3] * q[3])); @@ -224,15 +212,15 @@ void quattoeuler(LinmathEulerAngle euler, const LinmathQuat q) { void quatfromaxisangle(LinmathQuat q, const FLT *axis, FLT radians) { FLT v[3]; - normalize3d( v, axis ); - + normalize3d(v, axis); + FLT sn = FLT_SIN(radians / 2.0f); q[0] = FLT_COS(radians / 2.0f); q[1] = sn * v[0]; q[2] = sn * v[1]; q[3] = sn * v[2]; - quatnormalize( q, q ); + quatnormalize(q, q); } FLT quatmagnitude(const LinmathQuat q) { @@ -240,19 +228,19 @@ FLT quatmagnitude(const LinmathQuat q) { } FLT quatinvsqmagnitude(const LinmathQuat q) { - return ((FLT)1.)/FLT_SQRT((q[0]*q[0])+(q[1]*q[1])+(q[2]*q[2])+(q[3]*q[3])); + return ((FLT)1.) / FLT_SQRT((q[0] * q[0]) + (q[1] * q[1]) + (q[2] * q[2]) + (q[3] * q[3])); } void quatnormalize(LinmathQuat qout, const LinmathQuat qin) { - FLT imag = quatinvsqmagnitude( qin ); - quatscale( qout, qin, imag ); + FLT imag = quatinvsqmagnitude(qin); + quatscale(qout, qin, imag); } void quattomatrix(FLT *matrix44, const LinmathQuat qin) { FLT q[4]; quatnormalize(q, qin); - //Reduced calulation for speed + // Reduced calulation for speed FLT xx = 2 * q[1] * q[1]; FLT xy = 2 * q[1] * q[2]; FLT xz = 2 * q[1] * q[3]; @@ -265,7 +253,7 @@ void quattomatrix(FLT *matrix44, const LinmathQuat qin) { FLT zz = 2 * q[3] * q[3]; FLT zw = 2 * q[3] * q[0]; - //opengl major + // opengl major matrix44[0] = 1 - yy - zz; matrix44[1] = xy - zw; matrix44[2] = xz + yw; @@ -320,16 +308,16 @@ void quatfrommatrix33(FLT *q, const FLT *m) { } void quatfrommatrix(LinmathQuat q, const FLT *matrix44) { - //Algorithm from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/ + // Algorithm from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/ FLT tr = matrix44[0] + matrix44[5] + matrix44[10]; if (tr > 0) { - FLT S = FLT_SQRT(tr+1.0) * 2.; // S=4*qw + FLT S = FLT_SQRT(tr + 1.0) * 2.; // S=4*qw q[0] = 0.25f * S; q[1] = (matrix44[9] - matrix44[6]) / S; q[2] = (matrix44[2] - matrix44[8]) / S; q[3] = (matrix44[4] - matrix44[1]) / S; - } else if ((matrix44[0] > matrix44[5])&&(matrix44[0] > matrix44[10])) { + } else if ((matrix44[0] > matrix44[5]) && (matrix44[0] > matrix44[10])) { FLT S = FLT_SQRT(1.0 + matrix44[0] - matrix44[5] - matrix44[10]) * 2.; // S=4*qx q[0] = (matrix44[9] - matrix44[6]) / S; q[1] = 0.25f * S; @@ -350,13 +338,12 @@ void quatfrommatrix(LinmathQuat q, const FLT *matrix44) { } } - // Algorithm from http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ void quattomatrix33(FLT *matrix33, const LinmathQuat qin) { FLT q[4]; quatnormalize(q, qin); - //Reduced calulation for speed + // Reduced calulation for speed FLT xx = 2 * q[1] * q[1]; FLT xy = 2 * q[1] * q[2]; FLT xz = 2 * q[1] * q[3]; @@ -369,8 +356,7 @@ void quattomatrix33(FLT *matrix33, const LinmathQuat qin) { FLT zz = 2 * q[3] * q[3]; FLT zw = 2 * q[3] * q[0]; - - //opengl major + // opengl major matrix33[0] = 1 - yy - zz; matrix33[1] = xy + zw; matrix33[2] = xz - yw; @@ -393,8 +379,8 @@ void quatgetconjugate(LinmathQuat qout, const LinmathQuat qin) { void quatgetreciprocal(LinmathQuat qout, const LinmathQuat qin) { FLT m = quatinvsqmagnitude(qin); - quatgetconjugate( qout, qin ); - quatscale( qout, qout, m ); + quatgetconjugate(qout, qin); + quatscale(qout, qout, m); } void quatsub(LinmathQuat qout, const FLT *a, const FLT *b) { @@ -412,11 +398,11 @@ void quatadd(LinmathQuat qout, const FLT *a, const FLT *b) { } void quatrotateabout(LinmathQuat qout, const LinmathQuat q1, const LinmathQuat q2) { - //NOTE: Does not normalize - qout[0] = (q1[0]*q2[0])-(q1[1]*q2[1])-(q1[2]*q2[2])-(q1[3]*q2[3]); - qout[1] = (q1[0]*q2[1])+(q1[1]*q2[0])+(q1[2]*q2[3])-(q1[3]*q2[2]); - qout[2] = (q1[0]*q2[2])-(q1[1]*q2[3])+(q1[2]*q2[0])+(q1[3]*q2[1]); - qout[3] = (q1[0]*q2[3])+(q1[1]*q2[2])-(q1[2]*q2[1])+(q1[3]*q2[0]); + // NOTE: Does not normalize + qout[0] = (q1[0] * q2[0]) - (q1[1] * q2[1]) - (q1[2] * q2[2]) - (q1[3] * q2[3]); + qout[1] = (q1[0] * q2[1]) + (q1[1] * q2[0]) + (q1[2] * q2[3]) - (q1[3] * q2[2]); + qout[2] = (q1[0] * q2[2]) - (q1[1] * q2[3]) + (q1[2] * q2[0]) + (q1[3] * q2[1]); + qout[3] = (q1[0] * q2[3]) + (q1[1] * q2[2]) - (q1[2] * q2[1]) + (q1[3] * q2[0]); } void quatscale(LinmathQuat qout, const LinmathQuat qin, FLT s) { @@ -427,96 +413,87 @@ void quatscale(LinmathQuat qout, const LinmathQuat qin, FLT s) { } FLT quatinnerproduct(const LinmathQuat qa, const LinmathQuat qb) { - return (qa[0]*qb[0])+(qa[1]*qb[1])+(qa[2]*qb[2])+(qa[3]*qb[3]); + return (qa[0] * qb[0]) + (qa[1] * qb[1]) + (qa[2] * qb[2]) + (qa[3] * qb[3]); } void quatouterproduct(FLT *outvec3, LinmathQuat qa, LinmathQuat qb) { - outvec3[0] = (qa[0]*qb[1])-(qa[1]*qb[0])-(qa[2]*qb[3])+(qa[3]*qb[2]); - outvec3[1] = (qa[0]*qb[2])+(qa[1]*qb[3])-(qa[2]*qb[0])-(qa[3]*qb[1]); - outvec3[2] = (qa[0]*qb[3])-(qa[1]*qb[2])+(qa[2]*qb[1])-(qa[3]*qb[0]); + outvec3[0] = (qa[0] * qb[1]) - (qa[1] * qb[0]) - (qa[2] * qb[3]) + (qa[3] * qb[2]); + outvec3[1] = (qa[0] * qb[2]) + (qa[1] * qb[3]) - (qa[2] * qb[0]) - (qa[3] * qb[1]); + outvec3[2] = (qa[0] * qb[3]) - (qa[1] * qb[2]) + (qa[2] * qb[1]) - (qa[3] * qb[0]); } void quatevenproduct(LinmathQuat q, LinmathQuat qa, LinmathQuat qb) { - q[0] = (qa[0]*qb[0])-(qa[1]*qb[1])-(qa[2]*qb[2])-(qa[3]*qb[3]); - q[1] = (qa[0]*qb[1])+(qa[1]*qb[0]); - q[2] = (qa[0]*qb[2])+(qa[2]*qb[0]); - q[3] = (qa[0]*qb[3])+(qa[3]*qb[0]); + q[0] = (qa[0] * qb[0]) - (qa[1] * qb[1]) - (qa[2] * qb[2]) - (qa[3] * qb[3]); + q[1] = (qa[0] * qb[1]) + (qa[1] * qb[0]); + q[2] = (qa[0] * qb[2]) + (qa[2] * qb[0]); + q[3] = (qa[0] * qb[3]) + (qa[3] * qb[0]); } void quatoddproduct(FLT *outvec3, LinmathQuat qa, LinmathQuat qb) { - outvec3[0] = (qa[2]*qb[3])-(qa[3]*qb[2]); - outvec3[1] = (qa[3]*qb[1])-(qa[1]*qb[3]); - outvec3[2] = (qa[1]*qb[2])-(qa[2]*qb[1]); + outvec3[0] = (qa[2] * qb[3]) - (qa[3] * qb[2]); + outvec3[1] = (qa[3] * qb[1]) - (qa[1] * qb[3]); + outvec3[2] = (qa[1] * qb[2]) - (qa[2] * qb[1]); } void quatslerp(LinmathQuat q, const LinmathQuat qa, const LinmathQuat qb, FLT t) { FLT an[4]; FLT bn[4]; - quatnormalize( an, qa ); - quatnormalize( bn, qb ); - FLT cosTheta = quatinnerproduct(an,bn); + quatnormalize(an, qa); + quatnormalize(bn, qb); + FLT cosTheta = quatinnerproduct(an, bn); FLT sinTheta; - //Careful: If cosTheta is exactly one, or even if it's infinitesimally over, it'll + // Careful: If cosTheta is exactly one, or even if it's infinitesimally over, it'll // cause SQRT to produce not a number, and screw everything up. - if ( 1 - (cosTheta*cosTheta) <= 0 ) + if (1 - (cosTheta * cosTheta) <= 0) sinTheta = 0; else - sinTheta = FLT_SQRT(1 - (cosTheta*cosTheta)); + sinTheta = FLT_SQRT(1 - (cosTheta * cosTheta)); - FLT Theta = FLT_ACOS(cosTheta); //Theta is half the angle between the 2 MQuaternions + FLT Theta = FLT_ACOS(cosTheta); // Theta is half the angle between the 2 MQuaternions if (FLT_FABS(Theta) < DEFAULT_EPSILON) - quatcopy( q, qa ); - else if (FLT_FABS(sinTheta) < DEFAULT_EPSILON) - { - quatadd( q, qa, qb ); - quatscale( q, q, 0.5 ); - } - else - { + quatcopy(q, qa); + else if (FLT_FABS(sinTheta) < DEFAULT_EPSILON) { + quatadd(q, qa, qb); + quatscale(q, q, 0.5); + } else { FLT aside[4]; FLT bside[4]; - quatscale( bside, qb, FLT_SIN(t * Theta)); - quatscale( aside, qa, FLT_SIN((1 - t)*Theta)); - quatadd( q, aside, bside ); - quatscale( q, q, ((FLT)1.)/sinTheta ); + quatscale(bside, qb, FLT_SIN(t * Theta)); + quatscale(aside, qa, FLT_SIN((1 - t) * Theta)); + quatadd(q, aside, bside); + quatscale(q, q, ((FLT)1.) / sinTheta); } } void quatrotatevector(FLT *vec3out, const LinmathQuat quat, const FLT *vec3in) { - //See: http://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/ + // See: http://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/ FLT tmp[3]; FLT tmp2[3]; - cross3d( tmp, &quat[1], vec3in ); + cross3d(tmp, &quat[1], vec3in); tmp[0] += vec3in[0] * quat[0]; tmp[1] += vec3in[1] * quat[0]; tmp[2] += vec3in[2] * quat[0]; - cross3d( tmp2, &quat[1], tmp ); + cross3d(tmp2, &quat[1], tmp); vec3out[0] = vec3in[0] + 2 * tmp2[0]; vec3out[1] = vec3in[1] + 2 * tmp2[1]; vec3out[2] = vec3in[2] + 2 * tmp2[2]; } - // Matrix Stuff -Matrix3x3 inverseM33(const Matrix3x3 mat) -{ +Matrix3x3 inverseM33(const Matrix3x3 mat) { Matrix3x3 newMat; - for (int a = 0; a < 3; a++) - { - for (int b = 0; b < 3; b++) - { + for (int a = 0; a < 3; a++) { + for (int b = 0; b < 3; b++) { newMat.val[a][b] = mat.val[a][b]; } } - for (int i = 0; i < 3; i++) - { - for (int j = i + 1; j < 3; j++) - { + for (int i = 0; i < 3; i++) { + for (int j = i + 1; j < 3; j++) { FLT tmp = newMat.val[i][j]; newMat.val[i][j] = newMat.val[j][i]; newMat.val[j][i] = tmp; @@ -526,8 +503,7 @@ Matrix3x3 inverseM33(const Matrix3x3 mat) return newMat; } -void rotation_between_vecs_to_m3(Matrix3x3 *m, const FLT v1[3], const FLT v2[3]) -{ +void rotation_between_vecs_to_m3(Matrix3x3 *m, const FLT v1[3], const FLT v2[3]) { FLT q[4]; quatfrom2vectors(q, v1, v2); @@ -535,8 +511,7 @@ void rotation_between_vecs_to_m3(Matrix3x3 *m, const FLT v1[3], const FLT v2[3]) quattomatrix33(&(m->val[0][0]), q); } -void rotate_vec(FLT *out, const FLT *in, Matrix3x3 rot) -{ +void rotate_vec(FLT *out, const FLT *in, Matrix3x3 rot) { out[0] = rot.val[0][0] * in[0] + rot.val[1][0] * in[1] + rot.val[2][0] * in[2]; out[1] = rot.val[0][1] * in[0] + rot.val[1][1] * in[1] + rot.val[2][1] * in[2]; out[2] = rot.val[0][2] * in[0] + rot.val[1][2] * in[1] + rot.val[2][2] * in[2]; @@ -544,7 +519,6 @@ void rotate_vec(FLT *out, const FLT *in, Matrix3x3 rot) return; } - // This function based on code from Object-oriented Graphics Rendering Engine // Copyright(c) 2000 - 2012 Torus Knot Software Ltd // under MIT license @@ -557,8 +531,7 @@ If you call this with a dest vector that is close to the inverse of this vector, we will rotate 180 degrees around a generated axis if since in this case ANY axis of rotation is valid. */ -void quatfrom2vectors(FLT *q, const FLT *src, const FLT *dest) -{ +void quatfrom2vectors(FLT *q, const FLT *src, const FLT *dest) { // Based on Stan Melax's article in Game Programming Gems // Copy, since cannot modify local @@ -567,32 +540,26 @@ void quatfrom2vectors(FLT *q, const FLT *src, const FLT *dest) normalize3d(v0, src); normalize3d(v1, dest); - FLT d = dot3d(v0, v1);// v0.dotProduct(v1); + FLT d = dot3d(v0, v1); // v0.dotProduct(v1); // If dot == 1, vectors are the same - if (d >= 1.0f) - { + if (d >= 1.0f) { quatsetnone(q); return; } - if (d < (1e-6f - 1.0f)) - { + if (d < (1e-6f - 1.0f)) { // Generate an axis - FLT unitX[3] = { 1, 0, 0 }; - FLT unitY[3] = { 0, 1, 0 }; - + FLT unitX[3] = {1, 0, 0}; + FLT unitY[3] = {0, 1, 0}; + FLT axis[3]; - cross3d(axis, unitX, src); // pick an angle - if ((axis[0] < 1.0e-35f) && - (axis[1] < 1.0e-35f) && - (axis[2] < 1.0e-35f)) // pick another if colinear + cross3d(axis, unitX, src); // pick an angle + if ((axis[0] < 1.0e-35f) && (axis[1] < 1.0e-35f) && (axis[2] < 1.0e-35f)) // pick another if colinear { cross3d(axis, unitY, src); } normalize3d(axis, axis); quatfromaxisangle(q, axis, LINMATHPI); - } - else - { + } else { FLT s = FLT_SQRT((1 + d) * 2); FLT invs = 1 / s; @@ -608,13 +575,9 @@ void quatfrom2vectors(FLT *q, const FLT *src, const FLT *dest) } } -void matrix44copy(FLT * mout, const FLT * minm ) -{ - memcpy( mout, minm, sizeof( FLT ) * 16 ); -} +void matrix44copy(FLT *mout, const FLT *minm) { memcpy(mout, minm, sizeof(FLT) * 16); } -void matrix44transpose(FLT * mout, const FLT * minm ) -{ +void matrix44transpose(FLT *mout, const FLT *minm) { mout[0] = minm[0]; mout[1] = minm[4]; mout[2] = minm[8]; @@ -634,7 +597,6 @@ void matrix44transpose(FLT * mout, const FLT * minm ) mout[13] = minm[7]; mout[14] = minm[11]; mout[15] = minm[15]; - } void ApplyPoseToPoint(LinmathPoint3d pout, const LinmathPose *pose, const LinmathPoint3d pin) { @@ -654,5 +616,18 @@ void InvertPose(LinmathPose *poseout, const LinmathPose *pose) { scale3d(poseout->Pos, poseout->Pos, -1); } +void PoseToMatrix(FLT *matrix44, const LinmathPose *pose_in) { + quattomatrix(matrix44, pose_in->Rot); + + /* + matrix44[12] = pose_in->Pos[0]; + matrix44[13] = pose_in->Pos[1]; + matrix44[14] = pose_in->Pos[2]; + */ + matrix44[3] = pose_in->Pos[0]; + matrix44[7] = pose_in->Pos[1]; + matrix44[11] = pose_in->Pos[2]; +} + LinmathQuat LinmathQuat_Identity = {1.0}; LinmathPose LinmathPose_Identity = {.Rot = {1.0}}; diff --git a/redist/linmath.h b/redist/linmath.h index 5d5bed2..1a73a06 100644 --- a/redist/linmath.h +++ b/redist/linmath.h @@ -1,18 +1,18 @@ -//Copyright 2013,2016 <>< C. N. Lohr. This file licensed under the terms of the MIT/x11 license. +// Copyright 2013,2016 <>< C. N. Lohr. This file licensed under the terms of the MIT/x11 license. #ifndef _LINMATH_H #define _LINMATH_H -//Yes, I know it's kind of arbitrary. +// Yes, I know it's kind of arbitrary. #define DEFAULT_EPSILON 0.001 -//For printf +// For printf #define PFTHREE(x) (x)[0], (x)[1], (x)[2] #define PFFOUR(x) (x)[0], (x)[1], (x)[2], (x)[3] #define LINMATHPI ((FLT)3.141592653589) -//uncomment the following line to use double precision instead of single precision. +// uncomment the following line to use double precision instead of single precision. //#define USE_DOUBLE #ifdef USE_DOUBLE @@ -20,11 +20,11 @@ #define FLT double #define FLT_SQRT sqrt #define FLT_TAN tan -#define FLT_SIN sin -#define FLT_COS cos -#define FLT_ACOS acos -#define FLT_ASIN asin -#define FLT_ATAN2 atan2 +#define FLT_SIN sin +#define FLT_COS cos +#define FLT_ACOS acos +#define FLT_ASIN asin +#define FLT_ATAN2 atan2 #define FLT_FABS__ fabs #else @@ -32,17 +32,17 @@ #define FLT float #define FLT_SQRT sqrtf #define FLT_TAN tanf -#define FLT_SIN sinf -#define FLT_COS cosf -#define FLT_ACOS acosf -#define FLT_ASIN asinf -#define FLT_ATAN2 atan2f +#define FLT_SIN sinf +#define FLT_COS cosf +#define FLT_ACOS acosf +#define FLT_ASIN asinf +#define FLT_ATAN2 atan2f #define FLT_FABS__ fabsf #endif #ifdef TCC -#define FLT_FABS(x) (((x)<0)?(-(x)):(x)) +#define FLT_FABS(x) (((x) < 0) ? (-(x)) : (x)) #else #define FLT_FABS FLT_FABS__ #endif @@ -59,33 +59,33 @@ typedef struct LinmathPose { extern LinmathQuat LinmathQuat_Identity; extern LinmathPose LinmathPose_Identity; -//NOTE: Inputs may never be output with cross product. -void cross3d( FLT * out, const FLT * a, const FLT * b ); +// NOTE: Inputs may never be output with cross product. +void cross3d(FLT *out, const FLT *a, const FLT *b); -void sub3d( FLT * out, const FLT * a, const FLT * b ); +void sub3d(FLT *out, const FLT *a, const FLT *b); -void add3d( FLT * out, const FLT * a, const FLT * b ); +void add3d(FLT *out, const FLT *a, const FLT *b); -void scale3d( FLT * out, const FLT * a, FLT scalar ); +void scale3d(FLT *out, const FLT *a, FLT scalar); -void normalize3d( FLT * out, const FLT * in ); +void normalize3d(FLT *out, const FLT *in); -FLT dot3d( const FLT * a, const FLT * b ); +FLT dot3d(const FLT *a, const FLT *b); -//Returns 0 if equal. If either argument is null, 0 will ALWAYS be returned. -int compare3d( const FLT * a, const FLT * b, FLT epsilon ); +// Returns 0 if equal. If either argument is null, 0 will ALWAYS be returned. +int compare3d(const FLT *a, const FLT *b, FLT epsilon); -void copy3d( FLT * out, const FLT * in ); +void copy3d(FLT *out, const FLT *in); -FLT magnitude3d(const FLT * a ); +FLT magnitude3d(const FLT *a); -FLT anglebetween3d( FLT * a, FLT * b ); +FLT anglebetween3d(FLT *a, FLT *b); void rotatearoundaxis(FLT *outvec3, FLT *invec3, FLT *axis, FLT angle); void angleaxisfrom2vect(FLT *angle, FLT *axis, FLT *src, FLT *dest); void axisanglefromquat(FLT *angle, FLT *axis, LinmathQuat quat); -//Quaternion things... +// Quaternion things... typedef FLT LinmathEulerAngle[3]; @@ -126,10 +126,10 @@ void ApplyPoseToPose(LinmathPose *pout, const LinmathPose *lhs_pose, const Linma // by definition. void InvertPose(LinmathPose *poseout, const LinmathPose *pose_in); +void PoseToMatrix(FLT *mat44, const LinmathPose *pose_in); // Matrix Stuff -typedef struct -{ +typedef struct { FLT val[3][3]; // row, column } Matrix3x3; @@ -137,12 +137,7 @@ void rotate_vec(FLT *out, const FLT *in, Matrix3x3 rot); void rotation_between_vecs_to_m3(Matrix3x3 *m, const FLT v1[3], const FLT v2[3]); Matrix3x3 inverseM33(const Matrix3x3 mat); - -void matrix44copy(FLT * mout, const FLT * minm ); -void matrix44transpose(FLT * mout, const FLT * minm ); - +void matrix44copy(FLT *mout, const FLT *minm); +void matrix44transpose(FLT *mout, const FLT *minm); #endif - - - -- cgit v1.2.3 From 31c9dcb9f783e4920f675010833739f9a3783eea Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 21:24:19 -0600 Subject: Made degenerate poses call SV_ERROR --- src/poser.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/poser.c b/src/poser.c index 2cfe28d..7dcdc33 100644 --- a/src/poser.c +++ b/src/poser.c @@ -1,6 +1,7 @@ #include "math.h" #include #include +#include #include void PoserData_poser_raw_pose_func(PoserData *poser_data, SurviveObject *so, uint8_t lighthouse, SurvivePose *pose) { @@ -18,6 +19,11 @@ void PoserData_lighthouse_pose_func(PoserData *poser_data, SurviveObject *so, ui } else { const FLT up[3] = {0, 0, 1}; + if (quatmagnitude(lighthouse_pose->Rot) == 0) { + SurviveContext *ctx = so->ctx; + SV_ERROR("Pose func called with invalid pose."); + } + // Assume that the space solved for is valid but completely arbitrary. We are going to do a few things: // a) Using the gyro data, normalize it so that gravity is pushing straight down along Z // c) Assume the object is at origin -- cgit v1.2.3 From 93ce31bf11cb22c5a09b5af04a76c7b7a6b912fd Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 21:28:18 -0600 Subject: Made it so viz tool didn't require remote arg --- tools/viz/survive_viewer.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tools/viz/survive_viewer.js b/tools/viz/survive_viewer.js index df10ec3..67e65f0 100644 --- a/tools/viz/survive_viewer.js +++ b/tools/viz/survive_viewer.js @@ -167,7 +167,7 @@ function create_tracked_object(info) { var p = info.config.lighthouse_config.modelPoints[idx]; var pn = info.config.lighthouse_config.modelNormals[idx]; var color = idx / info.config.lighthouse_config.modelPoints * 0xFFFFFF; - if (idx === 6) + if (idx === 0) color = 0x00ff00; var sensorMaterial = new THREE.MeshBasicMaterial({color : color}); var newSensor = new THREE.Mesh(sensorGeometry, sensorMaterial); @@ -176,7 +176,7 @@ function create_tracked_object(info) { var normalGeom = new THREE.Geometry(); normalGeom.vertices.push(newSensor.position, new THREE.Vector3(p[0] + pn[0] * .02, p[1] + pn[1] * .02, p[2] + pn[2] * .02)); - var normal= new THREE.Line(normalGeom, new THREE.LineBasicMaterial({color : idx == 6 ? 0xFF0000 : 0x00FF00})); + var normal= new THREE.Line(normalGeom, new THREE.LineBasicMaterial({color : idx == 4 ? 0xFF0000 : 0x00FF00})); group.add(normal); group.sensors[idx] = sensorMaterial; group.add(newSensor); @@ -240,7 +240,6 @@ var survive_log_handlers = { objs[obj.tracker].position.set(obj.position[0], obj.position[1], obj.position[2]); objs[obj.tracker].quaternion.set(obj.quat[1], obj.quat[2], obj.quat[3], obj.quat[0]); objs[obj.tracker].verticesNeedUpdate = true; - timecode[obj.tracker] = obj.timecode; if (trails) { @@ -337,7 +336,7 @@ $(function() { var url = new URL(window.location.href); var remote = url.searchParams.get("remote"); - if (remote.length) { + if (remote && remote.length) { survive_ws = new WebSocket("ws://" + remote + "/ws"); } else if (window.location.protocol === "file:") { survive_ws = new WebSocket("ws://localhost:8080/ws"); -- cgit v1.2.3 From d9ecb4d321bfa04b5d67fb501be0cd9c46140775 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 25 Mar 2018 21:29:32 -0600 Subject: Added tool to calculate various things about length of received pulses --- include/libsurvive/survive.h | 1 + src/survive_sensor_activations.c | 4 +- tools/lightlengthparams/Makefile | 15 ++++ tools/lightlengthparams/lightlengthparams.c | 112 ++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 tools/lightlengthparams/Makefile create mode 100644 tools/lightlengthparams/lightlengthparams.c diff --git a/include/libsurvive/survive.h b/include/libsurvive/survive.h index b1c32cd..8a1474b 100644 --- a/include/libsurvive/survive.h +++ b/include/libsurvive/survive.h @@ -16,6 +16,7 @@ extern "C" { typedef struct { FLT angles[SENSORS_PER_OBJECT][NUM_LIGHTHOUSES][2]; // 2 Axes (Angles in LH space) uint32_t timecode[SENSORS_PER_OBJECT][NUM_LIGHTHOUSES][2]; // Timecode per axis in ticks + uint32_t lengths[SENSORS_PER_OBJECT][NUM_LIGHTHOUSES][2]; // Timecode per axis in ticks FLT accel[3]; FLT gyro[3]; diff --git a/src/survive_sensor_activations.c b/src/survive_sensor_activations.c index 4d1801c..e42b50e 100644 --- a/src/survive_sensor_activations.c +++ b/src/survive_sensor_activations.c @@ -21,9 +21,11 @@ void SurviveSensorActivations_add(SurviveSensorActivations *self, struct PoserDa int axis = (lightData->acode & 1); uint32_t *data_timecode = &self->timecode[lightData->sensor_id][lightData->lh][axis]; FLT *angle = &self->angles[lightData->sensor_id][lightData->lh][axis]; + uint32_t *length = &self->lengths[lightData->sensor_id][lightData->lh][axis]; *angle = lightData->angle; *data_timecode = lightData->timecode; + *length = lightData->length * 48000000; } -uint32_t SurviveSensorActivations_default_tolerance = (uint32_t)(48000000 /*mhz*/ * (16.7 * 2 /*ms*/) / 1000); \ No newline at end of file +uint32_t SurviveSensorActivations_default_tolerance = (uint32_t)(48000000 /*mhz*/ * (16.7 * 2 /*ms*/) / 1000); diff --git a/tools/lightlengthparams/Makefile b/tools/lightlengthparams/Makefile new file mode 100644 index 0000000..b743f4f --- /dev/null +++ b/tools/lightlengthparams/Makefile @@ -0,0 +1,15 @@ +all : lightlengthparams + +SRT:=../.. + +LIBSURVIVE:=$(SRT)/lib/libsurvive.so + +CFLAGS:=-I$(SRT)/redist -I$(SRT)/include -O0 -g -DFLT=double -DUSE_DOUBLE +LDFLAGS:=-lm -lpthread -llapacke -lcblas + +lightlengthparams : lightlengthparams.c $(LIBSURVIVE) + gcc $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean : + rm -rf lightlengthparams + diff --git a/tools/lightlengthparams/lightlengthparams.c b/tools/lightlengthparams/lightlengthparams.c new file mode 100644 index 0000000..3b28b3f --- /dev/null +++ b/tools/lightlengthparams/lightlengthparams.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include + +uint32_t current_timecode; + +void light_process(SurviveObject *so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, + uint32_t lighthouse) { + current_timecode = timecode; + survive_default_light_process(so, sensor_id, acode, timeinsweep, timecode, length, lighthouse); +} + +void raw_pose_process(SurviveObject *so, uint8_t _lh, SurvivePose *pose2w) { + survive_default_raw_pose_process(so, _lh, pose2w); + + /*printf("Pose: "); + for(int i = 0;i < 7;i++) { + printf("%f, ", pose2w->Pos[i]); + }; + printf("\n"); + */ + for (int lh = 0; lh < 2; lh++) { + SurvivePose pose2lh = {}; + SurvivePose w2lh = {}; + InvertPose(&w2lh, &so->ctx->bsd[lh].Pose); + ApplyPoseToPose(&pose2lh, &w2lh, pose2w); + + SurviveSensorActivations *scene = &so->activations; + for (size_t sensor_idx = 0; sensor_idx < so->sensor_ct; sensor_idx++) { + if (SurviveSensorActivations_isPairValid(scene, SurviveSensorActivations_default_tolerance / 2, + current_timecode, sensor_idx, lh)) { + uint32_t *lengths = scene->lengths[sensor_idx][lh]; + + const FLT *sensor_location = so->sensor_locations + 3 * sensor_idx; + const FLT *sensor_normals = so->sensor_normals + 3 * sensor_idx; + + LinmathPoint3d sensor = {}, sensorN = {}; + + scale3d(sensorN, sensor_normals, .01); + add3d(sensorN, sensor_location, sensor_normals); + + /* + printf("\n"); + printf("%f, %f, %f\n", sensor_location[0], sensor_location[1], sensor_location[2]); + printf("%f, %f, %f\n", sensorN[0], sensorN[1], sensorN[2]); + + FLT m[4][4]; + PoseToMatrix((FLT*)m, &pose2lh); + + for(int i = 0;i < 7;i++) { + printf("%f, ", pose2lh.Pos[i]); + }; + printf("\n"); + for(int i = 0;i < 4;i++) { + for(int j = 0;j < 4;j++) { + printf("%f, ", m[i][j]); + } + printf("\n"); + } + printf("\n"); + */ + ApplyPoseToPoint(sensor, &pose2lh, sensor_location); + ApplyPoseToPoint(sensorN, &pose2lh, sensorN); + + // printf("%f, %f, %f\n", sensor[0], sensor[1], sensor[2]); + // printf("%f, %f, %f\n", sensorN[0], sensorN[1], sensorN[2]); + FLT dist = magnitude3d(sensor); + LinmathVec3d zout = {0, 0, -dist}; + LinmathQuat r; + quatfrom2vectors(r, sensor, zout); + quatrotatevector(sensorN, r, sensorN); + sub3d(sensorN, sensorN, zout); + + FLT dot = dot3d(sensor, sensorN); + if (dist > 20 || dist < 0.25) + continue; + + FLT angs[2] = {}; + for (int axis = 0; axis < 2; axis++) { + angs[axis] = cos(atan2(fabs(sensorN[axis ? 0 : 1]), sensorN[2])); + } + FLT area = angs[0] * angs[1]; + + printf("%u\t%u\t%lu\t%f\t%f\t%f\t%f\t%u\t%u\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n", current_timecode, lh, + sensor_idx, dist, angs[0], angs[1], area, lengths[0], lengths[1], dot, sensor[0], sensor[1], + sensor[2], sensorN[0], sensorN[1], sensorN[2]); + + // assert(angs[0] >= 0); + } + } + } +} + +int main(int argc, char **argv) { + SurviveContext *ctx = survive_init(argc, argv); + if (ctx == 0) // implies -help or similiar + return 0; + + printf("timecode\tlh\tsensor_idx\tdistance\tnorm_x\tnorm_y\tarea\tlength_x\tlength_y\tdot\tx\ty\tz\tnx\tny\tnz\n"); + + survive_startup(ctx); + + survive_install_raw_pose_fn(ctx, raw_pose_process); + survive_install_light_fn(ctx, light_process); + while (survive_poll(ctx) == 0) { + } + + survive_close(ctx); + return 0; +} -- cgit v1.2.3 From b543e202ab776f41d0e3301e43bf3d3bc40f0c84 Mon Sep 17 00:00:00 2001 From: dpeter99 Date: Mon, 26 Mar 2018 20:19:07 +0200 Subject: Some fixes No more build errors on win --- winbuild/calibrate/calibrate.vcxproj | 6 +++++- winbuild/calibrate/calibrate.vcxproj.filters | 14 +++++++++++++- winbuild/libsurvive/libsurvive.vcxproj | 7 +++---- winbuild/libsurvive/libsurvive.vcxproj.filters | 18 ++++++------------ 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/winbuild/calibrate/calibrate.vcxproj b/winbuild/calibrate/calibrate.vcxproj index 4392e49..51519e6 100644 --- a/winbuild/calibrate/calibrate.vcxproj +++ b/winbuild/calibrate/calibrate.vcxproj @@ -177,9 +177,13 @@ + + + - + + diff --git a/winbuild/calibrate/calibrate.vcxproj.filters b/winbuild/calibrate/calibrate.vcxproj.filters index 546497e..dae64dc 100644 --- a/winbuild/calibrate/calibrate.vcxproj.filters +++ b/winbuild/calibrate/calibrate.vcxproj.filters @@ -18,9 +18,21 @@ Source Files + + Source Files + + + Source Files + + + Source Files + - + + Header Files + + Header Files diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index 3ce9dd3..ffb89b0 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -82,6 +82,7 @@ Windows + DbgHelp.lib;SetupAPI.lib;%(AdditionalDependencies) @@ -139,8 +140,6 @@ - - @@ -163,18 +162,19 @@ + + - @@ -186,7 +186,6 @@ - diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index e96e220..092e27f 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -75,12 +75,6 @@ Source Files - - Source Files - - - Source Files - Source Files @@ -108,6 +102,12 @@ Source Files + + Source Files + + + Source Files + @@ -149,12 +149,6 @@ Header Files - - Header Files - - - Header Files - Source Files -- cgit v1.2.3 From d4cef29d1322a2d1ecf8b672485e39e388066e5f Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 26 Mar 2018 12:44:11 -0600 Subject: os_generic is now a header only library --- Makefile | 18 +-- redist/os_generic.c | 337 ----------------------------------------------- redist/os_generic.h | 369 +++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 302 insertions(+), 422 deletions(-) delete mode 100644 redist/os_generic.c diff --git a/Makefile b/Makefile index ac04d60..f95ca61 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ endif SBA:=redist/sba/sba_chkjac.o redist/sba/sba_crsm.o redist/sba/sba_lapack.o redist/sba/sba_levmar.o redist/sba/sba_levmar_wrap.o POSERS:=src/poser_dummy.o src/poser_daveortho.o src/poser_charlesslow.o src/poser_octavioradii.o src/poser_turveytori.o src/poser_epnp.o src/poser_sba.o -REDISTS:=redist/json_helpers.o redist/linmath.o redist/jsmn.o redist/os_generic.o redist/minimal_opencv.o +REDISTS:=redist/json_helpers.o redist/linmath.o redist/jsmn.o redist/minimal_opencv.o ifeq ($(UNAME), Darwin) REDISTS:=$(REDISTS) redist/hid-osx.c endif @@ -66,23 +66,23 @@ LIBSURVIVE_C:=$(LIBSURVIVE_O:.o=.c) testCocoa : testCocoa.c $(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) -test : test.c ./lib/libsurvive.so redist/os_generic.o +test : test.c ./lib/libsurvive.so $(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) -simple_pose_test : simple_pose_test.c ./lib/libsurvive.so redist/os_generic.o $(DRAWFUNCTIONS) +simple_pose_test : simple_pose_test.c ./lib/libsurvive.so $(DRAWFUNCTIONS) $(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) -data_recorder : data_recorder.c ./lib/libsurvive.so redist/os_generic.c +data_recorder : data_recorder.c ./lib/libsurvive.so $(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) -calibrate : calibrate.c ./lib/libsurvive.so redist/os_generic.c $(DRAWFUNCTIONS) +calibrate : calibrate.c ./lib/libsurvive.so $(DRAWFUNCTIONS) $(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) -calibrate_client : calibrate_client.c ./lib/libsurvive.so redist/os_generic.c $(GRAPHICS_LOFI) +calibrate_client : calibrate_client.c ./lib/libsurvive.so $(GRAPHICS_LOFI) $(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS) ## Still not working!!! Don't use. -static_calibrate : calibrate.c redist/os_generic.c $(DRAWFUNCTIONS) $(LIBSURVIVE_C) +static_calibrate : calibrate.c $(DRAWFUNCTIONS) $(LIBSURVIVE_C) tcc -o $@ $^ $(CFLAGS) $(LDFLAGS) -DTCC ./redist/dclhelpers_debuggable.c : ./redist/dclhelpers.c ./redist/dclhelpers.h ./redist/dclapack.h @@ -91,7 +91,7 @@ static_calibrate : calibrate.c redist/os_generic.c $(DRAWFUNCTIONS) $(LIBSURVIVE sed -i 's/#/\/\/#/g' ./redist/dclhelpers_debuggable.c -test_dcl: ./redist/test_dcl.c ./redist/dclhelpers.c ./redist/dclhelpers.h ./redist/dclapack.h redist/os_generic.c ./redist/minimal_opencv.c ./src/epnp/epnp.c +test_dcl: ./redist/test_dcl.c ./redist/dclhelpers.c ./redist/dclhelpers.h ./redist/dclapack.h ./redist/minimal_opencv.c ./src/epnp/epnp.c $(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS_RELEASE) -DFLT=double test_dcl_debug: ./redist/test_dcl.c ./redist/dclhelpers_debuggable.c ./redist/dclhelpers.h ./redist/dclapack.h redist/os_generic.c @@ -114,7 +114,7 @@ lib/libsurvive.so : $(LIBSURVIVE_O) calibrate_tcc : $(LIBSURVIVE_C) - tcc -DRUNTIME_SYMNUM $(CFLAGS) -o $@ $^ $(LDFLAGS) calibrate.c redist/os_generic.c $(DRAWFUNCTIONS) redist/symbol_enumerator.c + tcc -DRUNTIME_SYMNUM $(CFLAGS) -o $@ $^ $(LDFLAGS) calibrate.c $(DRAWFUNCTIONS) redist/symbol_enumerator.c clean : rm -rf */*/*.o *.o src/*.o *~ src/*~ test simple_pose_test data_recorder calibrate testCocoa lib/libsurvive.so test_minimal_cv test_epnp test_epnp_ocv calibrate_client redist/*.o redist/*~ tools/data_server/data_server tools/lighthousefind/lighthousefind tools/lighthousefind_tori/lighthousefind-tori tools/plot_lighthouse/plot_lighthouse tools/process_rawcap/process_to_points redist/jsmntest redist/lintest diff --git a/redist/os_generic.c b/redist/os_generic.c deleted file mode 100644 index 3191357..0000000 --- a/redist/os_generic.c +++ /dev/null @@ -1,337 +0,0 @@ -#include "os_generic.h" - -#ifdef USE_WINDOWS - -#include - -void OGSleep( int is ) -{ - Sleep( is*1000 ); -} - -void OGUSleep( int ius ) -{ - Sleep( ius/1000 ); -} - -double OGGetAbsoluteTime() -{ - static LARGE_INTEGER lpf; - LARGE_INTEGER li; - - if( !lpf.QuadPart ) - { - QueryPerformanceFrequency( &lpf ); - } - - QueryPerformanceCounter( &li ); - return (double)li.QuadPart / (double)lpf.QuadPart; -} - - -double OGGetFileTime( const char * file ) -{ - FILETIME ft; - - HANDLE h = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); - - if( h==INVALID_HANDLE_VALUE ) - return -1; - - GetFileTime( h, 0, 0, &ft ); - - CloseHandle( h ); - - return ft.dwHighDateTime + ft.dwLowDateTime; -} - - -og_thread_t OGCreateThread( void * (routine)( void * ), void * parameter ) -{ - return (og_thread_t)CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)routine, parameter, 0, 0 ); -} - -void * OGJoinThread( og_thread_t ot ) -{ - WaitForSingleObject( ot, INFINITE ); - CloseHandle( ot ); - return 0; -} - -void OGCancelThread( og_thread_t ot ) -{ - CloseHandle( ot ); -} - -og_mutex_t OGCreateMutex() -{ - return CreateMutex( 0, 0, 0 ); -} - -void OGLockMutex( og_mutex_t om ) -{ - WaitForSingleObject(om, INFINITE); -} - -void OGUnlockMutex( og_mutex_t om ) -{ - ReleaseMutex(om); -} - -void OGDeleteMutex( og_mutex_t om ) -{ - CloseHandle( om ); -} - - - -og_sema_t OGCreateSema() -{ - HANDLE sem = CreateSemaphore( 0, 0, 32767, 0 ); - return (og_sema_t)sem; -} - -int OGGetSema( og_sema_t os ) -{ - typedef LONG NTSTATUS; - HANDLE sem = (HANDLE)os; - typedef NTSTATUS (NTAPI *_NtQuerySemaphore)( - HANDLE SemaphoreHandle, - DWORD SemaphoreInformationClass, /* Would be SEMAPHORE_INFORMATION_CLASS */ - PVOID SemaphoreInformation, /* but this is to much to dump here */ - ULONG SemaphoreInformationLength, - PULONG ReturnLength OPTIONAL - ); - - typedef struct _SEMAPHORE_BASIC_INFORMATION { - ULONG CurrentCount; - ULONG MaximumCount; - } SEMAPHORE_BASIC_INFORMATION; - - - static _NtQuerySemaphore NtQuerySemaphore; - SEMAPHORE_BASIC_INFORMATION BasicInfo; - NTSTATUS Status; - - if( !NtQuerySemaphore ) - { - NtQuerySemaphore = (_NtQuerySemaphore)GetProcAddress (GetModuleHandle ("ntdll.dll"), "NtQuerySemaphore"); - if( !NtQuerySemaphore ) - { - return -1; - } - } - - - Status = NtQuerySemaphore (sem, 0 /*SemaphoreBasicInformation*/, - &BasicInfo, sizeof (SEMAPHORE_BASIC_INFORMATION), NULL); - - if (Status == ERROR_SUCCESS) - { - return BasicInfo.CurrentCount; - } - - return -2; -} - -void OGLockSema( og_sema_t os ) -{ - WaitForSingleObject( (HANDLE)os, INFINITE ); -} - -void OGUnlockSema( og_sema_t os ) -{ - ReleaseSemaphore( (HANDLE)os, 1, 0 ); -} - -void OGDeleteSema( og_sema_t os ) -{ - CloseHandle( os ); -} - -#else - -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - -#include -#include -#include -#include -#include -#include - -pthread_mutex_t g_RawMutexStart = PTHREAD_MUTEX_INITIALIZER; - -void OGSleep( int is ) -{ - sleep( is ); -} - -void OGUSleep( int ius ) -{ - usleep( ius ); -} - -double OGGetAbsoluteTime() -{ - struct timeval tv; - gettimeofday( &tv, 0 ); - return ((double)tv.tv_usec)/1000000. + (tv.tv_sec); -} - -double OGGetFileTime( const char * file ) -{ - struct stat buff; - - int r = stat( file, &buff ); - - if( r < 0 ) - { - return -1; - } - - return buff.st_mtime; -} - - - -og_thread_t OGCreateThread( void * (routine)( void * ), void * parameter ) -{ - pthread_t * ret = (pthread_t *)malloc( sizeof( pthread_t ) ); - int r = pthread_create( ret, 0, routine, parameter ); - if( r ) - { - free( ret ); - return 0; - } - return (og_thread_t)ret; -} - -void * OGJoinThread( og_thread_t ot ) -{ - void * retval; - if( !ot ) - { - return 0; - } - pthread_join( *(pthread_t*)ot, &retval ); - free( ot ); - return retval; -} - -void OGCancelThread( og_thread_t ot ) -{ - if( !ot ) - { - return; - } - pthread_cancel( *(pthread_t*)ot ); - free( ot ); -} - -og_mutex_t OGCreateMutex() -{ - pthread_mutexattr_t mta; - og_mutex_t r = malloc( sizeof( pthread_mutex_t ) ); - - pthread_mutexattr_init(&mta); - pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE); - - pthread_mutex_init( (pthread_mutex_t *)r, &mta ); - - return r; -} - -void OGLockMutex( og_mutex_t om ) -{ - if( !om ) - { - return; - } - pthread_mutex_lock( (pthread_mutex_t*)om ); -} - -void OGUnlockMutex( og_mutex_t om ) -{ - if( !om ) - { - return; - } - pthread_mutex_unlock( (pthread_mutex_t*)om ); -} - -void OGDeleteMutex( og_mutex_t om ) -{ - if( !om ) - { - return; - } - - pthread_mutex_destroy( (pthread_mutex_t*)om ); - free( om ); -} - - - - -og_sema_t OGCreateSema() -{ - sem_t * sem = (sem_t *)malloc( sizeof( sem_t ) ); - sem_init( sem, 0, 0 ); - return (og_sema_t)sem; -} - -int OGGetSema( og_sema_t os ) -{ - int valp; - sem_getvalue( (sem_t *)os, &valp ); - return valp; -} - - -void OGLockSema( og_sema_t os ) -{ - sem_wait( (sem_t *)os ); -} - -void OGUnlockSema( og_sema_t os ) -{ - sem_post( (sem_t *)os ); -} - -void OGDeleteSema( og_sema_t os ) -{ - sem_destroy( (sem_t *)os ); - free(os); -} - - - -#endif - -//Date Stamp: 2012-02-15 - -/* - Copyright (c) 2011-2012 <>< Charles Lohr - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of this file. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ - diff --git a/redist/os_generic.h b/redist/os_generic.h index 0924030..853440a 100644 --- a/redist/os_generic.h +++ b/redist/os_generic.h @@ -1,76 +1,293 @@ -#ifndef _OS_GENERIC_H -#define _OS_GENERIC_H - -#if defined( WIN32 ) || defined (WINDOWS) || defined( _WIN32) -#define USE_WINDOWS -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -//Things that shouldn't be macro'd -double OGGetAbsoluteTime(); -void OGSleep( int is ); -void OGUSleep( int ius ); -double OGGetFileTime( const char * file ); - -//Threads and Mutices -typedef void* og_thread_t; -typedef void* og_mutex_t; -typedef void* og_sema_t; - -og_thread_t OGCreateThread( void * (routine)( void * ), void * parameter ); -void * OGJoinThread( og_thread_t ot ); -void OGCancelThread( og_thread_t ot ); - -//Always a recrusive mutex. -og_mutex_t OGCreateMutex(); -void OGLockMutex( og_mutex_t om ); -void OGUnlockMutex( og_mutex_t om ); -void OGDeleteMutex( og_mutex_t om ); - -//Always a semaphore -og_sema_t OGCreateSema(); //Create a semaphore, comes locked initially. NOTE: Max count is 32767 -void OGLockSema( og_sema_t os ); -int OGGetSema( og_sema_t os ); //if <0 there was a failure. -void OGUnlockSema( og_sema_t os ); -void OGDeleteSema( og_sema_t os ); - -#ifdef __cplusplus -}; -#endif - - - -#endif - - -//Date Stamp: 2012-02-15 - -/* - NOTE: Portions (namely the top section) are part of headers from other - sources. - - Copyright (c) 2011-2012 <>< Charles Lohr - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of this file. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ - +#ifndef _OS_GENERIC_H +#define _OS_GENERIC_H +/* + "osgeneric" Generic, platform independent tool for the following operations: + + Delay functions: + void OGSleep( int is ); + void OGUSleep( int ius ); + + Getting current time (may be time from program start, boot, or epoc) + double OGGetAbsoluteTime(); + double OGGetFileTime( const char * file ); + + Thread functions + og_thread_t OGCreateThread( void * (routine)( void * ), void * parameter ); + void * OGJoinThread( og_thread_t ot ); + void OGCancelThread( og_thread_t ot ); + + Mutex functions, used for protecting data structures. + (recursive on platforms where available.) + og_mutex_t OGCreateMutex(); + void OGLockMutex( og_mutex_t om ); + void OGUnlockMutex( og_mutex_t om ); + void OGDeleteMutex( og_mutex_t om ); + +//Always a semaphore (not recursive) +// og_sema_t OGCreateSema(); //Create a semaphore, comes locked initially. NOTE: Max count is 32767 +// void OGLockSema( og_sema_t os ); +// int OGGetSema( og_sema_t os ); //if <0 there was a failure. +// void OGUnlockSema( og_sema_t os ); +// void OGDeleteSema( og_sema_t os ); + + + + Copyright (c) 2011-2012,2013,2016,2018 <>< Charles Lohr + This file may be licensed under the MIT/x11 license or the NewBSD license. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of this file. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + + Date Stamp: 2018-03-25: Switched to header-only format. +*/ + +#define OSG_INLINE static inline + +// Threads and Mutices +typedef void *og_thread_t; +typedef void *og_mutex_t; +typedef void *og_sema_t; + +#if defined(WIN32) || defined(WINDOWS) || defined(_WIN32) +#define USE_WINDOWS +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef USE_WINDOWS + +#include + +OSG_INLINE void OGSleep(int is) { Sleep(is * 1000); } + +OSG_INLINE void OGUSleep(int ius) { Sleep(ius / 1000); } + +OSG_INLINE double OGGetAbsoluteTime() { + static LARGE_INTEGER lpf; + LARGE_INTEGER li; + + if (!lpf.QuadPart) { + QueryPerformanceFrequency(&lpf); + } + + QueryPerformanceCounter(&li); + return (double)li.QuadPart / (double)lpf.QuadPart; +} + +OSG_INLINE double OGGetFileTime(const char *file) { + FILETIME ft; + + HANDLE h = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + + if (h == INVALID_HANDLE_VALUE) + return -1; + + GetFileTime(h, 0, 0, &ft); + + CloseHandle(h); + + return ft.dwHighDateTime + ft.dwLowDateTime; +} + +OSG_INLINE og_thread_t OGCreateThread(void *(routine)(void *), void *parameter) { + return (og_thread_t)CreateThread(0, 0, (LPTHREAD_START_ROUTINE)routine, parameter, 0, 0); +} + +OSG_INLINE void *OGJoinThread(og_thread_t ot) { + WaitForSingleObject(ot, INFINITE); + CloseHandle(ot); + return 0; +} + +OSG_INLINE void OGCancelThread(og_thread_t ot) { CloseHandle(ot); } + +OSG_INLINE og_mutex_t OGCreateMutex() { return CreateMutex(0, 0, 0); } + +OSG_INLINE void OGLockMutex(og_mutex_t om) { WaitForSingleObject(om, INFINITE); } + +OSG_INLINE void OGUnlockMutex(og_mutex_t om) { ReleaseMutex(om); } + +OSG_INLINE void OGDeleteMutex(og_mutex_t om) { CloseHandle(om); } + +OSG_INLINE og_sema_t OGCreateSema() { + HANDLE sem = CreateSemaphore(0, 0, 32767, 0); + return (og_sema_t)sem; +} + +OSG_INLINE int OGGetSema(og_sema_t os) { + typedef LONG NTSTATUS; + HANDLE sem = (HANDLE)os; + typedef NTSTATUS(NTAPI * _NtQuerySemaphore)( + HANDLE SemaphoreHandle, DWORD SemaphoreInformationClass, /* Would be SEMAPHORE_INFORMATION_CLASS */ + PVOID SemaphoreInformation, /* but this is to much to dump here */ + ULONG SemaphoreInformationLength, PULONG ReturnLength OPTIONAL); + + typedef struct _SEMAPHORE_BASIC_INFORMATION { + ULONG CurrentCount; + ULONG MaximumCount; + } SEMAPHORE_BASIC_INFORMATION; + + static _NtQuerySemaphore NtQuerySemaphore; + SEMAPHORE_BASIC_INFORMATION BasicInfo; + NTSTATUS Status; + + if (!NtQuerySemaphore) { + NtQuerySemaphore = (_NtQuerySemaphore)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySemaphore"); + if (!NtQuerySemaphore) { + return -1; + } + } + + Status = + NtQuerySemaphore(sem, 0 /*SemaphoreBasicInformation*/, &BasicInfo, sizeof(SEMAPHORE_BASIC_INFORMATION), NULL); + + if (Status == ERROR_SUCCESS) { + return BasicInfo.CurrentCount; + } + + return -2; +} + +OSG_INLINE void OGLockSema(og_sema_t os) { WaitForSingleObject((HANDLE)os, INFINITE); } + +OSG_INLINE void OGUnlockSema(og_sema_t os) { ReleaseSemaphore((HANDLE)os, 1, 0); } + +OSG_INLINE void OGDeleteSema(og_sema_t os) { CloseHandle(os); } + +#else + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +OSG_INLINE void OGSleep(int is) { sleep(is); } + +OSG_INLINE void OGUSleep(int ius) { usleep(ius); } + +OSG_INLINE double OGGetAbsoluteTime() { + struct timeval tv; + gettimeofday(&tv, 0); + return ((double)tv.tv_usec) / 1000000. + (tv.tv_sec); +} + +OSG_INLINE double OGGetFileTime(const char *file) { + struct stat buff; + + int r = stat(file, &buff); + + if (r < 0) { + return -1; + } + + return buff.st_mtime; +} + +OSG_INLINE og_thread_t OGCreateThread(void *(routine)(void *), void *parameter) { + pthread_t *ret = malloc(sizeof(pthread_t)); + int r = pthread_create(ret, 0, routine, parameter); + if (r) { + free(ret); + return 0; + } + return (og_thread_t)ret; +} + +static void *OGJoinThread(og_thread_t ot) { + void *retval; + if (!ot) { + return 0; + } + pthread_join(*(pthread_t *)ot, &retval); + free(ot); + return retval; +} + +OSG_INLINE void OGCancelThread(og_thread_t ot) { + if (!ot) { + return; + } + pthread_cancel(*(pthread_t *)ot); + free(ot); +} + +OSG_INLINE og_mutex_t OGCreateMutex() { + pthread_mutexattr_t mta; + og_mutex_t r = malloc(sizeof(pthread_mutex_t)); + + pthread_mutexattr_init(&mta); + pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE); + + pthread_mutex_init((pthread_mutex_t *)r, &mta); + + return r; +} + +OSG_INLINE void OGLockMutex(og_mutex_t om) { + if (!om) { + return; + } + pthread_mutex_lock((pthread_mutex_t *)om); +} + +OSG_INLINE void OGUnlockMutex(og_mutex_t om) { + if (!om) { + return; + } + pthread_mutex_unlock((pthread_mutex_t *)om); +} + +OSG_INLINE void OGDeleteMutex(og_mutex_t om) { + if (!om) { + return; + } + + pthread_mutex_destroy((pthread_mutex_t *)om); + free(om); +} + +OSG_INLINE og_sema_t OGCreateSema() { + sem_t *sem = malloc(sizeof(sem_t)); + sem_init(sem, 0, 0); + return (og_sema_t)sem; +} + +OSG_INLINE int OGGetSema(og_sema_t os) { + int valp; + sem_getvalue(os, &valp); + return valp; +} + +OSG_INLINE void OGLockSema(og_sema_t os) { sem_wait(os); } + +OSG_INLINE void OGUnlockSema(og_sema_t os) { sem_post(os); } + +OSG_INLINE void OGDeleteSema(og_sema_t os) { + sem_destroy(os); + free(os); +} + +#endif + +#endif -- cgit v1.2.3 From 18e717642be3af3b9f72b630dcad68ca17c32dc9 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 26 Mar 2018 13:50:41 -0600 Subject: Made SBA calibrate with 1lh --- src/poser.c | 3 ++- src/poser_sba.c | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/poser.c b/src/poser.c index 7dcdc33..ea5812e 100644 --- a/src/poser.c +++ b/src/poser.c @@ -21,7 +21,8 @@ void PoserData_lighthouse_pose_func(PoserData *poser_data, SurviveObject *so, ui if (quatmagnitude(lighthouse_pose->Rot) == 0) { SurviveContext *ctx = so->ctx; - SV_ERROR("Pose func called with invalid pose."); + SV_INFO("Pose func called with invalid pose."); + return; } // Assume that the space solved for is valid but completely arbitrary. We are going to do a few things: diff --git a/src/poser_sba.c b/src/poser_sba.c index 226f387..82fbd56 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -439,8 +439,13 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd if (status >= 0) { SurvivePose additionalTx = {}; - PoserData_lighthouse_pose_func(&pdfs->hdr, so, 0, &additionalTx, &sbactx.camera_params[0], &sbactx.obj_pose); - PoserData_lighthouse_pose_func(&pdfs->hdr, so, 1, &additionalTx, &sbactx.camera_params[1], &sbactx.obj_pose); + for (int i = 0; i < NUM_LIGHTHOUSES; i++) { + if (quatmagnitude(sbactx.camera_params[i].Rot) != 0) { + PoserData_lighthouse_pose_func(&pdfs->hdr, so, i, &additionalTx, &sbactx.camera_params[i], + &sbactx.obj_pose); + } + } + } else { SurviveContext *ctx = so->ctx; SV_INFO("SBA was unable to run %d", status); -- cgit v1.2.3 From d106e045d8a145ceb733075e541f6aaaee5bd3a7 Mon Sep 17 00:00:00 2001 From: dpeter99 Date: Mon, 26 Mar 2018 21:57:28 +0200 Subject: Made the .def file - by hand for now --- winbuild/libsurvive/Test.txt | 3479 ++++++++++++++++++++++++ winbuild/libsurvive/libsurvive.def | 32 + winbuild/libsurvive/libsurvive.vcxproj | 9 +- winbuild/libsurvive/libsurvive.vcxproj.filters | 3 + 4 files changed, 3522 insertions(+), 1 deletion(-) create mode 100644 winbuild/libsurvive/Test.txt create mode 100644 winbuild/libsurvive/libsurvive.def diff --git a/winbuild/libsurvive/Test.txt b/winbuild/libsurvive/Test.txt new file mode 100644 index 0000000..5cf8680 --- /dev/null +++ b/winbuild/libsurvive/Test.txt @@ -0,0 +1,3479 @@ + libsurvive + + Timestamp is 5ab9467b (Mon Mar 26 21:14:03 2018) + + Preferred load address is 0000000180000000 + + Start Length Name Class + 0001:00000000 0001d166H .textbss DATA + 0002:00000000 0003cf90H .text$mn CODE + 0002:0003cf90 00001110H .text$mn$00 CODE + 0002:0003e0a0 00001132H .text$x CODE + 0003:00000000 00000110H .CRT$XCA DATA + 0003:00000110 00000110H .CRT$XCZ DATA + 0003:00000220 00000110H .CRT$XIA DATA + 0003:00000330 00000110H .CRT$XIZ DATA + 0003:00000440 00000110H .CRT$XPA DATA + 0003:00000550 00000110H .CRT$XPZ DATA + 0003:00000660 00000110H .CRT$XTA DATA + 0003:00000770 00000110H .CRT$XTZ DATA + 0003:00000880 0000e914H .rdata DATA + 0003:0000f194 00000174H .rdata$zzzdbg DATA + 0003:0000f308 00000110H .rtc$IAA DATA + 0003:0000f418 00000308H .rtc$IMZ DATA + 0003:0000f720 00000110H .rtc$IZZ DATA + 0003:0000f830 00000110H .rtc$TAA DATA + 0003:0000f940 00000308H .rtc$TMZ DATA + 0003:0000fc48 00000110H .rtc$TZZ DATA + 0003:0000fd58 000028e8H .xdata DATA + 0003:00012640 000004feH .edata DATA + 0004:00000000 000008e0H .data DATA + 0004:000008e0 00001b89H .bss DATA + 0005:00000000 000033f0H .pdata DATA + 0006:00000000 000006d8H .idata$5 DATA + 0006:000006d8 00000064H .idata$2 DATA + 0006:0000073c 00000014H .idata$3 DATA + 0006:00000750 000006d8H .idata$4 DATA + 0006:00000e28 00000afeH .idata$6 DATA + 0007:00000000 0000013fH .00cfg DATA + 0008:00000000 00000170H .rsrc$01 DATA + 0008:00000170 000002ccH .rsrc$02 DATA + + Address Publics by Value Rva+Base Lib:Object + + 0000:00000000 __hybrid_auxiliary_iat 0000000000000000 + 0000:00000000 __guard_fids_count 0000000000000000 + 0000:00000000 __guard_longjmp_count 0000000000000000 + 0000:00000000 __guard_fids_table 0000000000000000 + 0000:00000000 __guard_iat_table 0000000000000000 + 0000:00000000 __guard_iat_count 0000000000000000 + 0000:00000000 __dynamic_value_reloc_table 0000000000000000 + 0000:00000000 ___safe_se_handler_table 0000000000000000 + 0000:00000000 __enclave_config 0000000000000000 + 0000:00000000 __hybrid_code_map_count 0000000000000000 + 0000:00000000 __hybrid_code_map 0000000000000000 + 0000:00000000 __guard_longjmp_table 0000000000000000 + 0000:00000000 ___safe_se_handler_count 0000000000000000 + 0000:00000100 __guard_flags 0000000000000100 + 0000:00000000 __ImageBase 0000000180000000 + 0001:00000000 __enc$textbss$begin 0000000180001000 + 0001:0001d166 __enc$textbss$end 000000018001e166 + 0002:000014d0 crc32 00000001800204d0 f crc32.obj + 0002:00001680 hid_close 0000000180020680 f hid-windows.obj + 0002:00001700 hid_enumerate 0000000180020700 f hid-windows.obj + 0002:00002020 hid_error 0000000180021020 f hid-windows.obj + 0002:00002070 hid_exit 0000000180021070 f hid-windows.obj + 0002:000020e0 hid_free_enumeration 00000001800210e0 f hid-windows.obj + 0002:000021b0 hid_get_feature_report 00000001800211b0 f hid-windows.obj + 0002:00002330 hid_get_indexed_string 0000000180021330 f hid-windows.obj + 0002:00002420 hid_get_manufacturer_string 0000000180021420 f hid-windows.obj + 0002:00002500 hid_get_product_string 0000000180021500 f hid-windows.obj + 0002:000025e0 hid_get_serial_number_string 00000001800215e0 f hid-windows.obj + 0002:000026c0 hid_init 00000001800216c0 f hid-windows.obj + 0002:00002730 hid_open 0000000180021730 f hid-windows.obj + 0002:00002880 hid_open_path 0000000180021880 f hid-windows.obj + 0002:00002ac0 hid_read 0000000180021ac0 f hid-windows.obj + 0002:00002b70 hid_read_timeout 0000000180021b70 f hid-windows.obj + 0002:00002ea0 hid_send_feature_report 0000000180021ea0 f hid-windows.obj + 0002:00002f50 hid_set_nonblocking 0000000180021f50 f hid-windows.obj + 0002:00002fd0 hid_write 0000000180021fd0 f hid-windows.obj + 0002:00003950 jsmn_init 0000000180022950 f jsmn.obj + 0002:000039d0 jsmn_parse 00000001800229d0 f jsmn.obj + 0002:00004900 __local_stdio_printf_options 0000000180023900 f i json_helpers.obj + 0002:00004940 _vfprintf_l 0000000180023940 f i json_helpers.obj + 0002:000049d0 _vscprintf 00000001800239d0 f i json_helpers.obj + 0002:00004a40 _vscprintf_l 0000000180023a40 f i json_helpers.obj + 0002:00004b10 _vsnprintf 0000000180023b10 f i json_helpers.obj + 0002:00004ba0 _vsnprintf_l 0000000180023ba0 f i json_helpers.obj + 0002:00004c80 asprintf 0000000180023c80 f json_helpers.obj + 0002:00004db0 fprintf 0000000180023db0 f i json_helpers.obj + 0002:000050b0 json_load_file 00000001800240b0 f json_helpers.obj + 0002:00005460 json_write_double_array 0000000180024460 f json_helpers.obj + 0002:00005650 json_write_float 0000000180024650 f json_helpers.obj + 0002:000056e0 json_write_float_array 00000001800246e0 f json_helpers.obj + 0002:000058d0 json_write_str 00000001800248d0 f json_helpers.obj + 0002:00005950 json_write_uint32 0000000180024950 f json_helpers.obj + 0002:000059d0 load_file_to_mem 00000001800249d0 f json_helpers.obj + 0002:00005af0 parse_float_array 0000000180024af0 f json_helpers.obj + 0002:00005dc0 ApplyPoseToPoint 0000000180024dc0 f linmath.obj + 0002:00005e60 ApplyPoseToPose 0000000180024e60 f linmath.obj + 0002:00005f20 InvertPose 0000000180024f20 f linmath.obj + 0002:00006000 add3d 0000000180025000 f linmath.obj + 0002:00006140 angleaxisfrom2vect 0000000180025140 f linmath.obj + 0002:000063e0 anglebetween3d 00000001800253e0 f linmath.obj + 0002:00006500 axisanglefromquat 0000000180025500 f linmath.obj + 0002:000068a0 compare3d 00000001800258a0 f linmath.obj + 0002:00006ae0 copy3d 0000000180025ae0 f linmath.obj + 0002:00006bd0 cross3d 0000000180025bd0 f linmath.obj + 0002:00006dc0 dot3d 0000000180025dc0 f linmath.obj + 0002:00006ec0 inverseM33 0000000180025ec0 f linmath.obj + 0002:00007120 magnitude3d 0000000180026120 f linmath.obj + 0002:00007220 matrix44copy 0000000180026220 f linmath.obj + 0002:00007290 matrix44transpose 0000000180026290 f linmath.obj + 0002:00007630 normalize3d 0000000180026630 f linmath.obj + 0002:00007800 quatadd 0000000180026800 f linmath.obj + 0002:00007990 quatcopy 0000000180026990 f linmath.obj + 0002:00007ab0 quatevenproduct 0000000180026ab0 f linmath.obj + 0002:00007da0 quatfrom2vectors 0000000180026da0 f linmath.obj + 0002:00008150 quatfromaxisangle 0000000180027150 f linmath.obj + 0002:00008300 quatfromeuler 0000000180027300 f linmath.obj + 0002:000085c0 quatfrommatrix 00000001800275c0 f linmath.obj + 0002:00008d80 quatfrommatrix33 0000000180027d80 f linmath.obj + 0002:00009400 quatgetconjugate 0000000180028400 f linmath.obj + 0002:00009540 quatgetreciprocal 0000000180028540 f linmath.obj + 0002:000095e0 quatinnerproduct 00000001800285e0 f linmath.obj + 0002:00009710 quatinvsqmagnitude 0000000180028710 f linmath.obj + 0002:00009850 quatmagnitude 0000000180028850 f linmath.obj + 0002:00009980 quatnormalize 0000000180028980 f linmath.obj + 0002:00009a00 quatoddproduct 0000000180028a00 f linmath.obj + 0002:00009bf0 quatouterproduct 0000000180028bf0 f linmath.obj + 0002:00009f40 quatrotateabout 0000000180028f40 f linmath.obj + 0002:0000a390 quatrotatevector 0000000180029390 f linmath.obj + 0002:0000a6c0 quatscale 00000001800296c0 f linmath.obj + 0002:0000a810 quatsetnone 0000000180029810 f linmath.obj + 0002:0000a8d0 quatslerp 00000001800298d0 f linmath.obj + 0002:0000abb0 quatsub 0000000180029bb0 f linmath.obj + 0002:0000ad40 quattoeuler 0000000180029d40 f linmath.obj + 0002:0000b0d0 quattomatrix 000000018002a0d0 f linmath.obj + 0002:0000b5f0 quattomatrix33 000000018002a5f0 f linmath.obj + 0002:0000ba40 rotate_vec 000000018002aa40 f linmath.obj + 0002:0000bd90 rotatearoundaxis 000000018002ad90 f linmath.obj + 0002:0000c170 rotation_between_vecs_to_m3 000000018002b170 f linmath.obj + 0002:0000c250 scale3d 000000018002b250 f linmath.obj + 0002:0000c360 sub3d 000000018002b360 f linmath.obj + 0002:0000c4a0 OGCancelThread 000000018002b4a0 f os_generic.obj + 0002:0000c500 OGCreateMutex 000000018002b500 f os_generic.obj + 0002:0000c550 OGCreateSema 000000018002b550 f os_generic.obj + 0002:0000c5b0 OGCreateThread 000000018002b5b0 f os_generic.obj + 0002:0000c630 OGDeleteMutex 000000018002b630 f os_generic.obj + 0002:0000c690 OGDeleteSema 000000018002b690 f os_generic.obj + 0002:0000c6f0 OGGetAbsoluteTime 000000018002b6f0 f os_generic.obj + 0002:0000c790 OGGetFileTime 000000018002b790 f os_generic.obj + 0002:0000c890 OGGetSema 000000018002b890 f os_generic.obj + 0002:0000c990 OGJoinThread 000000018002b990 f os_generic.obj + 0002:0000ca00 OGLockMutex 000000018002ba00 f os_generic.obj + 0002:0000ca60 OGLockSema 000000018002ba60 f os_generic.obj + 0002:0000cac0 OGSleep 000000018002bac0 f os_generic.obj + 0002:0000cb20 OGUSleep 000000018002bb20 f os_generic.obj + 0002:0000cb80 OGUnlockMutex 000000018002bb80 f os_generic.obj + 0002:0000cbe0 OGUnlockSema 000000018002bbe0 f os_generic.obj + 0002:0000de30 puff 000000018002ce30 f puff.obj + 0002:0000e400 EnumerateSymbols 000000018002d400 f symbol_enumerator.obj + 0002:0000e4d0 mycb 000000018002d4d0 f symbol_enumerator.obj + 0002:0000e5a0 _half_to_float 000000018002d5a0 f ootx_decoder.obj + 0002:0000e750 get_ptr 000000018002d750 f ootx_decoder.obj + 0002:0000e7f0 init_lighthouse_info_v6 000000018002d7f0 f ootx_decoder.obj + 0002:0000eb90 ootx_decode_bit 000000018002db90 f ootx_decoder.obj + 0002:0000ec00 ootx_detect_preamble 000000018002dc00 f ootx_decoder.obj + 0002:0000ecb0 ootx_free_decoder_context 000000018002dcb0 f ootx_decoder.obj + 0002:0000ed30 ootx_inc_buffer_offset 000000018002dd30 f ootx_decoder.obj + 0002:0000ede0 ootx_init_decoder_context 000000018002dde0 f ootx_decoder.obj + 0002:0000eec0 ootx_process_bit 000000018002dec0 f ootx_decoder.obj + 0002:0000ef30 ootx_pump_bit 000000018002df30 f ootx_decoder.obj + 0002:0000f190 ootx_reset_buffer 000000018002e190 f ootx_decoder.obj + 0002:0000f220 ootx_write_to_buffer 000000018002e220 f ootx_decoder.obj + 0002:0000f310 print_lighthouse_info_v6 000000018002e310 f ootx_decoder.obj + 0002:0000f560 printf 000000018002e560 f i ootx_decoder.obj + 0002:0000f620 PoserData_lighthouse_pose_func 000000018002e620 f poser.obj + 0002:0000f9e0 PoserData_poser_raw_pose_func 000000018002e9e0 f poser.obj + 0002:0000fab0 PoserCharlesSlow 000000018002eab0 f poser_charlesslow.obj + 0002:00010970 REGISTERPoserCharlesSlow 000000018002f970 f poser_charlesslow.obj + 0002:000115f0 _vsprintf_l 00000001800305f0 f i poser_charlesslow.obj + 0002:00011680 sprintf 0000000180030680 f i poser_charlesslow.obj + 0002:00011730 OrthoSolve 0000000180030730 f poser_daveortho.obj + 0002:000169a0 PoserDaveOrtho 00000001800359a0 f poser_daveortho.obj + 0002:00017de0 REGISTERPoserDaveOrtho 0000000180036de0 f poser_daveortho.obj + 0002:00017e30 PoserDummy 0000000180036e30 f poser_dummy.obj + 0002:00017f80 REGISTERPoserDummy 0000000180036f80 f poser_dummy.obj + 0002:00017fd0 PoserOctavioRadii 0000000180036fd0 f poser_octavioradii.obj + 0002:00019420 REGISTERPoserOctavioRadii 0000000180038420 f poser_octavioradii.obj + 0002:0001a650 GetRotationMatrixForTorus 0000000180039650 f poser_turveytori.obj + 0002:0001a7e0 PoserTurveyTori 00000001800397e0 f poser_turveytori.obj + 0002:0001c1c0 REGISTERPoserTurveyTori 000000018003b1c0 f poser_turveytori.obj + 0002:0001d050 RotateAndTranslatePoint 000000018003c050 f poser_turveytori.obj + 0002:0001d3c0 RotationEstimateFitnessAxisAngle 000000018003c3c0 f poser_turveytori.obj + 0002:0001d690 RotationEstimateFitnessAxisAngleOriginal 000000018003c690 f poser_turveytori.obj + 0002:0001dae0 RotationEstimateFitnessOld 000000018003cae0 f poser_turveytori.obj + 0002:0001df10 RotationEstimateFitnessQuaternion 000000018003cf10 f poser_turveytori.obj + 0002:0001f9e0 SolveForRotation 000000018003e9e0 f poser_turveytori.obj + 0002:0001fb60 SolveForRotationQuat 000000018003eb60 f poser_turveytori.obj + 0002:0001fee0 angleBetweenSensors 000000018003eee0 f poser_turveytori.obj + 0002:0001ffb0 angleFromPoints 000000018003efb0 f poser_turveytori.obj + 0002:000202a0 calculateTorusPointFromAngles 000000018003f2a0 f poser_turveytori.obj + 0002:00020620 compareFlts 000000018003f620 f poser_turveytori.obj + 0002:000207f0 drawLineBetweenPoints 000000018003f7f0 f poser_turveytori.obj + 0002:00020850 estimateToroidalAndPoloidalAngleOfPoint 000000018003f850 f poser_turveytori.obj + 0002:00020d80 getAvgPoints 000000018003fd80 f poser_turveytori.obj + 0002:00020ec0 getGradient 000000018003fec0 f poser_turveytori.obj + 0002:00021260 getNormalizedAndScaledRotationGradient 0000000180040260 f poser_turveytori.obj + 0002:000212f0 getNormalizedAndScaledVector 00000001800402f0 f poser_turveytori.obj + 0002:00021490 getPointFitness 0000000180040490 f poser_turveytori.obj + 0002:00021860 getPointFitnessForPna 0000000180040860 f poser_turveytori.obj + 0002:00021a80 getRotationGradientAxisAngle 0000000180040a80 f poser_turveytori.obj + 0002:00021e40 getRotationGradientQuaternion 0000000180040e40 f poser_turveytori.obj + 0002:00022200 markPointWithStar 0000000180041200 f poser_turveytori.obj + 0002:00022250 midpoint 0000000180041250 f poser_turveytori.obj + 0002:00022390 pythAngleBetweenSensors2 0000000180041390 f poser_turveytori.obj + 0002:000224f0 updateHeader 00000001800414f0 f poser_turveytori.obj + 0002:00022530 writeAxes 0000000180041530 f poser_turveytori.obj + 0002:00022570 writePcdHeader 0000000180041570 f poser_turveytori.obj + 0002:000225b0 writePoint 00000001800415b0 f poser_turveytori.obj + 0002:00022610 writePointCloud 0000000180041610 f poser_turveytori.obj + 0002:00022660 GetDriverByConfig 0000000180041660 f survive.obj + 0002:00022a70 SymnumCheck 0000000180041a70 f survive.obj + 0002:00022cb0 survive_add_driver 0000000180041cb0 f survive.obj + 0002:00022eb0 survive_add_object 0000000180041eb0 f survive.obj + 0002:00022f90 survive_close 0000000180041f90 f survive.obj + 0002:00023440 survive_get_so_by_name 0000000180042440 f survive.obj + 0002:00023510 survive_haptic 0000000180042510 f survive.obj + 0002:000235e0 survive_init_internal 00000001800425e0 f survive.obj + 0002:00023d10 survive_install_angle_fn 0000000180042d10 f survive.obj + 0002:00023d90 survive_install_button_fn 0000000180042d90 f survive.obj + 0002:00023e10 survive_install_error_fn 0000000180042e10 f survive.obj + 0002:00023e90 survive_install_htc_config_fn 0000000180042e90 f survive.obj + 0002:00023f10 survive_install_imu_fn 0000000180042f10 f survive.obj + 0002:00023f90 survive_install_info_fn 0000000180042f90 f survive.obj + 0002:00024010 survive_install_light_fn 0000000180043010 f survive.obj + 0002:00024090 survive_install_lighthouse_pose_fn 0000000180043090 f survive.obj + 0002:00024110 survive_install_raw_pose_fn 0000000180043110 f survive.obj + 0002:00024190 survive_poll 0000000180043190 f survive.obj + 0002:000242a0 survive_send_magic 00000001800432a0 f survive.obj + 0002:000243e0 survive_simple_inflate 00000001800433e0 f survive.obj + 0002:00024510 survive_startup 0000000180043510 f survive.obj + 0002:00024b90 survive_verify_FLT_size 0000000180043b90 f survive.obj + 0002:000267b0 ootx_packet_clbk_d 00000001800457b0 f survive_cal.obj + 0002:00026c60 snprintf 0000000180045c60 f i survive_cal.obj + 0002:00026d20 survive_cal_angle 0000000180045d20 f survive_cal.obj + 0002:000275a0 survive_cal_get_status 00000001800465a0 f survive_cal.obj + 0002:00027850 survive_cal_install 0000000180046850 f survive_cal.obj + 0002:00027d80 survive_cal_light 0000000180046d80 f survive_cal.obj + 0002:000280d0 vsnprintf 00000001800470d0 f i survive_cal.obj + 0002:000281a0 DisambiguatorCharles 00000001800471a0 f survive_charlesbiguator.obj + 0002:00028cc0 REGISTERDisambiguatorCharles 0000000180047cc0 f survive_charlesbiguator.obj + 0002:00028db0 _json_write_float_array 0000000180047db0 f survive_config.obj + 0002:00028fe0 config_read 0000000180047fe0 f survive_config.obj + 0002:000290d0 config_read_float 00000001800480d0 f survive_config.obj + 0002:00029180 config_read_float_array 0000000180048180 f survive_config.obj + 0002:00029320 config_read_lighthouse 0000000180048320 f survive_config.obj + 0002:00029690 config_read_str 0000000180048690 f survive_config.obj + 0002:00029730 config_read_uint32 0000000180048730 f survive_config.obj + 0002:000297d0 config_save 00000001800487d0 f survive_config.obj + 0002:000298c0 config_set_float 00000001800488c0 f survive_config.obj + 0002:00029990 config_set_float_a 0000000180048990 f survive_config.obj + 0002:00029b00 config_set_lighthouse 0000000180048b00 f survive_config.obj + 0002:00029cf0 config_set_str 0000000180048cf0 f survive_config.obj + 0002:00029df0 config_set_uint32 0000000180048df0 f survive_config.obj + 0002:00029ec0 destroy_config_entry 0000000180048ec0 f survive_config.obj + 0002:00029f70 destroy_config_group 0000000180048f70 f survive_config.obj + 0002:0002a040 find_config_entry 0000000180049040 f survive_config.obj + 0002:0002a110 handle_config_group 0000000180049110 f survive_config.obj + 0002:0002a220 handle_tag_value 0000000180049220 f survive_config.obj + 0002:0002a320 init_config_entry 0000000180049320 f survive_config.obj + 0002:0002a3b0 init_config_group 00000001800493b0 f survive_config.obj + 0002:0002a4c0 next_unused_entry 00000001800494c0 f survive_config.obj + 0002:0002a5a0 parse_floats 00000001800495a0 f survive_config.obj + 0002:0002a7e0 parse_uint32 00000001800497e0 f survive_config.obj + 0002:0002aa00 pop_config_group 0000000180049a00 f survive_config.obj + 0002:0002aa50 print_json_value 0000000180049a50 f survive_config.obj + 0002:0002ab00 resize_config_group 0000000180049b00 f survive_config.obj + 0002:0002acf0 sstrcpy 0000000180049cf0 f survive_config.obj + 0002:0002ae10 survive_configf 0000000180049e10 f survive_config.obj + 0002:0002af60 survive_configi 0000000180049f60 f survive_config.obj + 0002:0002b0a0 survive_configs 000000018004a0a0 f survive_config.obj + 0002:0002b1e0 write_config_group 000000018004a1e0 f survive_config.obj + 0002:0002baa0 survive_create_hmd 000000018004aaa0 f survive_default_devices.obj + 0002:0002bb30 survive_create_tr0 000000018004ab30 f survive_default_devices.obj + 0002:0002bbc0 survive_create_wm0 000000018004abc0 f survive_default_devices.obj + 0002:0002bc50 survive_create_wm1 000000018004ac50 f survive_default_devices.obj + 0002:0002bce0 survive_create_ww0 000000018004ace0 f survive_default_devices.obj + 0002:0002bd70 survive_load_htc_config_format 000000018004ad70 f survive_default_devices.obj + 0002:0002c750 handle_lightcap 000000018004b750 f survive_disambiguator.obj + 0002:0002c7d0 GetDriver 000000018004b7d0 f survive_driverman.obj + 0002:0002c880 GetDriverNameMatching 000000018004b880 f survive_driverman.obj + 0002:0002c9a0 ListDrivers 000000018004b9a0 f survive_driverman.obj + 0002:0002ca40 RegisterDriver 000000018004ba40 f survive_driverman.obj + 0002:0002cae0 DriverRegPlayback 000000018004bae0 f survive_playback.obj + 0002:0002d120 REGISTERDriverRegPlayback 000000018004c120 f survive_playback.obj + 0002:0002d170 __local_stdio_scanf_options 000000018004c170 f i survive_playback.obj + 0002:0002d1b0 _vsscanf_l 000000018004c1b0 f i survive_playback.obj + 0002:0002dd80 sscanf 000000018004cd80 f i survive_playback.obj + 0002:0002de30 survive_install_recording 000000018004ce30 f survive_playback.obj + 0002:0002e120 survive_recording_angle_process 000000018004d120 f survive_playback.obj + 0002:0002e210 survive_recording_config_process 000000018004d210 f survive_playback.obj + 0002:0002e350 survive_recording_imu_process 000000018004d350 f survive_playback.obj + 0002:0002e4f0 survive_recording_info_process 000000018004d4f0 f survive_playback.obj + 0002:0002e580 survive_recording_light_process 000000018004d580 f survive_playback.obj + 0002:0002e7f0 survive_recording_lightcap 000000018004d7f0 f survive_playback.obj + 0002:0002e8d0 survive_recording_lighthouse_process 000000018004d8d0 f survive_playback.obj + 0002:0002ea70 survive_recording_raw_pose_process 000000018004da70 f survive_playback.obj + 0002:0002ec80 vfprintf 000000018004dc80 f i survive_playback.obj + 0002:0002ee70 survive_default_angle_process 000000018004de70 f survive_process.obj + 0002:0002f070 survive_default_button_process 000000018004e070 f survive_process.obj + 0002:0002f0c0 survive_default_htc_config_process 000000018004e0c0 f survive_process.obj + 0002:0002f150 survive_default_imu_process 000000018004e150 f survive_process.obj + 0002:0002f3d0 survive_default_light_process 000000018004e3d0 f survive_process.obj + 0002:0002f750 survive_default_lighthouse_pose_process 000000018004e750 f survive_process.obj + 0002:0002f8f0 survive_default_raw_pose_process 000000018004e8f0 f survive_process.obj + 0002:0002fa30 survive_calibration_config_create_from_idx 000000018004ea30 f survive_reproject.obj + 0002:0002fc40 survive_calibration_config_index 000000018004ec40 f survive_reproject.obj + 0002:0002fd10 survive_calibration_config_max_idx 000000018004ed10 f survive_reproject.obj + 0002:0002fdb0 survive_calibration_default_config 000000018004edb0 f survive_reproject.obj + 0002:0002fe50 survive_calibration_options_config_apply 000000018004ee50 f survive_reproject.obj + 0002:000300a0 survive_reproject 000000018004f0a0 f survive_reproject.obj + 0002:00030150 survive_reproject_from_pose 000000018004f150 f survive_reproject.obj + 0002:000301f0 survive_reproject_from_pose_with_config 000000018004f1f0 f survive_reproject.obj + 0002:00030730 SurviveSensorActivations_add 000000018004f730 f survive_sensor_activations.obj + 0002:00030850 SurviveSensorActivations_add_imu 000000018004f850 f survive_sensor_activations.obj + 0002:00030a20 SurviveSensorActivations_isPairValid 000000018004fa20 f survive_sensor_activations.obj + 0002:00030b20 DisambiguatorTurvey 000000018004fb20 f survive_turveybiguator.obj + 0002:00030c70 REGISTERDisambiguatorTurvey 000000018004fc70 f survive_turveybiguator.obj + 0002:00031e20 DriverRegHTCVive 0000000180050e20 f survive_vive.obj + 0002:000324d0 HAPIReceiver 00000001800514d0 f survive_vive.obj + 0002:00032790 REGISTERDriverRegHTCVive 0000000180051790 f survive_vive.obj + 0002:000327e0 _vfwprintf_l 00000001800517e0 f i survive_vive.obj + 0002:00032870 calibrate_acc 0000000180051870 f survive_vive.obj + 0002:00032b00 calibrate_gyro 0000000180051b00 f survive_vive.obj + 0002:00034020 incrementAndPostButtonQueue 0000000180053020 f survive_vive.obj + 0002:000341a0 init_SurviveObject 00000001800531a0 f survive_vive.obj + 0002:00034280 registerButtonEvent 0000000180053280 f survive_vive.obj + 0002:00034840 survive_data_cb 0000000180053840 f survive_vive.obj + 0002:000353c0 survive_get_config 00000001800543c0 f survive_vive.obj + 0002:00035a70 survive_usb_init 0000000180054a70 f survive_vive.obj + 0002:000366f0 survive_vive_close 00000001800556f0 f survive_vive.obj + 0002:00036760 survive_vive_send_haptic 0000000180055760 f survive_vive.obj + 0002:00036980 survive_vive_send_magic 0000000180055980 f survive_vive.obj + 0002:00036eb0 survive_vive_usb_close 0000000180055eb0 f survive_vive.obj + 0002:00036f90 survive_vive_usb_poll 0000000180055f90 f survive_vive.obj + 0002:00037090 wprintf 0000000180056090 f i survive_vive.obj + 0002:00037150 getdelim 0000000180056150 f getdelim.obj + 0002:00037410 getline 0000000180056410 f getdelim.obj + 0002:00037485 SymEnumSymbols 0000000180056485 f DbgHelp:dbghelp.dll + 0002:0003748b SymInitialize 000000018005648b f DbgHelp:dbghelp.dll + 0002:00037491 SymCleanup 0000000180056491 f DbgHelp:dbghelp.dll + 0002:00037497 SetupDiEnumDeviceInfo 0000000180056497 f SetupAPI:SETUPAPI.dll + 0002:0003749d SetupDiDestroyDeviceInfoList 000000018005649d f SetupAPI:SETUPAPI.dll + 0002:000374a3 SetupDiEnumDeviceInterfaces 00000001800564a3 f SetupAPI:SETUPAPI.dll + 0002:000374a9 SetupDiGetDeviceInterfaceDetailA 00000001800564a9 f SetupAPI:SETUPAPI.dll + 0002:000374af SetupDiGetClassDevsA 00000001800564af f SetupAPI:SETUPAPI.dll + 0002:000374b5 SetupDiGetDeviceRegistryPropertyA 00000001800564b5 f SetupAPI:SETUPAPI.dll + 0002:000374bb CreateFileA 00000001800564bb f kernel32:KERNEL32.dll + 0002:000374c1 ReadFile 00000001800564c1 f kernel32:KERNEL32.dll + 0002:000374c7 WriteFile 00000001800564c7 f kernel32:KERNEL32.dll + 0002:000374cd CloseHandle 00000001800564cd f kernel32:KERNEL32.dll + 0002:000374d3 GetLastError 00000001800564d3 f kernel32:KERNEL32.dll + 0002:000374d9 DeviceIoControl 00000001800564d9 f kernel32:KERNEL32.dll + 0002:000374df GetOverlappedResult 00000001800564df f kernel32:KERNEL32.dll + 0002:000374e5 CancelIo 00000001800564e5 f kernel32:KERNEL32.dll + 0002:000374eb ResetEvent 00000001800564eb f kernel32:KERNEL32.dll + 0002:000374f1 WaitForSingleObject 00000001800564f1 f kernel32:KERNEL32.dll + 0002:000374f7 CreateEventA 00000001800564f7 f kernel32:KERNEL32.dll + 0002:000374fd FreeLibrary 00000001800564fd f kernel32:KERNEL32.dll + 0002:00037503 GetProcAddress 0000000180056503 f kernel32:KERNEL32.dll + 0002:00037509 LoadLibraryA 0000000180056509 f kernel32:KERNEL32.dll + 0002:0003750f LocalFree 000000018005650f f kernel32:KERNEL32.dll + 0002:00037515 FormatMessageW 0000000180056515 f kernel32:KERNEL32.dll + 0002:0003751b GetFileTime 000000018005651b f kernel32:KERNEL32.dll + 0002:00037521 QueryPerformanceCounter 0000000180056521 f kernel32:KERNEL32.dll + 0002:00037527 QueryPerformanceFrequency 0000000180056527 f kernel32:KERNEL32.dll + 0002:0003752d ReleaseSemaphore 000000018005652d f kernel32:KERNEL32.dll + 0002:00037533 ReleaseMutex 0000000180056533 f kernel32:KERNEL32.dll + 0002:00037539 CreateMutexA 0000000180056539 f kernel32:KERNEL32.dll + 0002:0003753f Sleep 000000018005653f f kernel32:KERNEL32.dll + 0002:00037545 CreateThread 0000000180056545 f kernel32:KERNEL32.dll + 0002:0003754b GetModuleHandleA 000000018005654b f kernel32:KERNEL32.dll + 0002:00037551 CreateSemaphoreA 0000000180056551 f kernel32:KERNEL32.dll + 0002:00037557 GetCurrentProcess 0000000180056557 f kernel32:KERNEL32.dll + 0002:0003755d CreateDirectoryA 000000018005655d f kernel32:KERNEL32.dll + 0002:00037570 _CRT_RTC_INIT 0000000180056570 f MSVCRTD:_init_.obj + 0002:00037580 _CRT_RTC_INITW 0000000180056580 f MSVCRTD:_init_.obj + 0002:00037590 _RTC_InitBase 0000000180056590 f MSVCRTD:_init_.obj + 0002:000375e0 _RTC_Shutdown 00000001800565e0 f MSVCRTD:_init_.obj + 0002:00037610 __raise_securityfailure 0000000180056610 f MSVCRTD:gs_report.obj + 0002:00037660 __report_gsfailure 0000000180056660 f MSVCRTD:gs_report.obj + 0002:00037770 __report_rangecheckfailure 0000000180056770 f MSVCRTD:gs_report.obj + 0002:00037790 __report_securityfailure 0000000180056790 f MSVCRTD:gs_report.obj + 0002:00037860 __report_securityfailureEx 0000000180056860 f MSVCRTD:gs_report.obj + 0002:00037b60 _RTC_AllocaHelper 0000000180056b60 f MSVCRTD:_stack_.obj + 0002:00037bb0 _RTC_CheckStackVars 0000000180056bb0 f MSVCRTD:_stack_.obj + 0002:00037c60 _RTC_CheckStackVars2 0000000180056c60 f MSVCRTD:_stack_.obj + 0002:00037db0 __GSHandlerCheck 0000000180056db0 f MSVCRTD:_gshandler_.obj + 0002:00037e00 __GSHandlerCheckCommon 0000000180056e00 f MSVCRTD:_gshandler_.obj + 0002:00037f50 __security_check_cookie 0000000180056f50 f MSVCRTD:_amdsecgs_.obj + 0002:00037f90 __chkstk 0000000180056f90 f MSVCRTD:_chkstk_.obj + 0002:00037f90 _alloca_probe 0000000180056f90 f MSVCRTD:_chkstk_.obj + 0002:000384e0 _CRT_INIT 00000001800574e0 f MSVCRTD:dll_dllmain.obj + 0002:00038520 _DllMainCRTStartup 0000000180057520 f MSVCRTD:dll_dllmain.obj + 0002:00038570 ?_RTC_GetErrorFunc@@YAP6AHHPEBDH00ZZPEBX@Z 0000000180057570 f MSVCRTD:_userapi_.obj + 0002:00038580 ?_RTC_GetErrorFuncW@@YAP6AHHPEB_WH00ZZPEBX@Z 0000000180057580 f MSVCRTD:_userapi_.obj + 0002:00038590 _RTC_GetErrDesc 0000000180057590 f MSVCRTD:_userapi_.obj + 0002:000385b0 _RTC_NumErrors 00000001800575b0 f MSVCRTD:_userapi_.obj + 0002:000385c0 _RTC_SetErrorFunc 00000001800575c0 f MSVCRTD:_userapi_.obj + 0002:000385e0 _RTC_SetErrorFuncW 00000001800575e0 f MSVCRTD:_userapi_.obj + 0002:00038600 _RTC_SetErrorType 0000000180057600 f MSVCRTD:_userapi_.obj + 0002:00038630 ??$__vcrt_va_start_verify_argument_type@QEBD@@YAXXZ 0000000180057630 f i MSVCRTD:_error_.obj + 0002:000386f0 ?_RTC_AllocaFailure@@YAXPEAXPEAU_RTC_ALLOCA_NODE@@H@Z 00000001800576f0 f MSVCRTD:_error_.obj + 0002:000388a0 ?_RTC_Failure@@YAXPEAXH@Z 00000001800578a0 f MSVCRTD:_error_.obj + 0002:00038910 ?_RTC_StackFailure@@YAXPEAXPEBD@Z 0000000180057910 f MSVCRTD:_error_.obj + 0002:00038e70 _RTC_UninitUse 0000000180057e70 f MSVCRTD:_error_.obj + 0002:00038f70 _vsprintf_s_l 0000000180057f70 f i MSVCRTD:_error_.obj + 0002:00038ff0 sprintf_s 0000000180057ff0 f i MSVCRTD:_error_.obj + 0002:00039130 __security_init_cookie 0000000180058130 f MSVCRTD:gs_support.obj + 0002:000391d0 DllMain 00000001800581d0 f MSVCRTD:dll_dllmain_stub.obj + 0002:00039220 ?__scrt_initialize_type_info@@YAXXZ 0000000180058220 f MSVCRTD:tncleanup.obj + 0002:00039240 ?__scrt_uninitialize_type_info@@YAXXZ 0000000180058240 f MSVCRTD:tncleanup.obj + 0002:00039260 __scrt_initialize_default_local_stdio_options 0000000180058260 f MSVCRTD:default_local_stdio_options.obj + 0002:000392c0 ??$__crt_fast_decode_pointer@PEAP6AXXZ@@YAPEAP6AXXZQEAP6AXXZ@Z 00000001800582c0 f i MSVCRTD:utility.obj + 0002:00039310 ??$__crt_fast_encode_pointer@PEAP6AXXZ@@YAPEAP6AXXZQEAP6AXXZ@Z 0000000180058310 f i MSVCRTD:utility.obj + 0002:00039360 ?__crt_rotate_pointer_value@@YA_K_KH@Z 0000000180058360 f i MSVCRTD:utility.obj + 0002:00039380 ?configure_argv@__scrt_narrow_argv_policy@@SAHXZ 0000000180058380 f i MSVCRTD:utility.obj + 0002:000394a0 ?initialize_environment@__scrt_narrow_environment_policy@@SAHXZ 00000001800584a0 f i MSVCRTD:utility.obj + 0002:00039570 NtCurrentTeb 0000000180058570 f i MSVCRTD:utility.obj + 0002:00039580 __scrt_acquire_startup_lock 0000000180058580 f MSVCRTD:utility.obj + 0002:00039600 __scrt_dllmain_after_initialize_c 0000000180058600 f MSVCRTD:utility.obj + 0002:00039640 __scrt_dllmain_before_initialize_c 0000000180058640 f MSVCRTD:utility.obj + 0002:00039670 __scrt_dllmain_crt_thread_attach 0000000180058670 f MSVCRTD:utility.obj + 0002:000396b0 __scrt_dllmain_crt_thread_detach 00000001800586b0 f MSVCRTD:utility.obj + 0002:000396d0 __scrt_dllmain_exception_filter 00000001800586d0 f MSVCRTD:utility.obj + 0002:00039750 __scrt_dllmain_uninitialize_c 0000000180058750 f MSVCRTD:utility.obj + 0002:00039790 __scrt_dllmain_uninitialize_critical 0000000180058790 f MSVCRTD:utility.obj + 0002:000397b0 __scrt_initialize_crt 00000001800587b0 f MSVCRTD:utility.obj + 0002:00039810 __scrt_initialize_onexit_tables 0000000180058810 f MSVCRTD:utility.obj + 0002:00039960 __scrt_is_nonwritable_in_current_image 0000000180058960 f MSVCRTD:utility.obj + 0002:00039a10 __scrt_release_startup_lock 0000000180058a10 f MSVCRTD:utility.obj + 0002:00039a50 __scrt_uninitialize_crt 0000000180058a50 f MSVCRTD:utility.obj + 0002:00039aa0 _onexit 0000000180058aa0 f MSVCRTD:utility.obj + 0002:00039b50 at_quick_exit 0000000180058b50 f MSVCRTD:utility.obj + 0002:00039bc0 atexit 0000000180058bc0 f MSVCRTD:utility.obj + 0002:00039c00 __scrt_get_dyn_tls_init_callback 0000000180058c00 f MSVCRTD:dyn_tls_init.obj + 0002:00039c10 __crt_debugger_hook 0000000180058c10 f MSVCRTD:utility_desktop.obj + 0002:00039c30 __scrt_fastfail 0000000180058c30 f MSVCRTD:utility_desktop.obj + 0002:00039e30 __scrt_get_show_window_mode 0000000180058e30 f MSVCRTD:utility_desktop.obj + 0002:00039ea0 __scrt_initialize_winrt 0000000180058ea0 f MSVCRTD:utility_desktop.obj + 0002:00039eb0 __scrt_is_managed_app 0000000180058eb0 f MSVCRTD:utility_desktop.obj + 0002:00039f80 __scrt_set_unhandled_exception_filter 0000000180058f80 f MSVCRTD:utility_desktop.obj + 0002:00039fa0 __scrt_unhandled_exception_filter 0000000180058fa0 f MSVCRTD:utility_desktop.obj + 0002:0003a030 _RTC_Initialize 0000000180059030 f MSVCRTD:_initsect_.obj + 0002:0003a090 _RTC_Terminate 0000000180059090 f MSVCRTD:_initsect_.obj + 0002:0003a0f0 _guard_check_icall 00000001800590f0 f i MSVCRTD:checkcfg.obj + 0002:0003a780 ?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180059780 f MSVCRTD:_pdblkup_.obj + 0002:0003ad10 __isa_available_init 0000000180059d10 f MSVCRTD:_cpu_disp_.obj + 0002:0003b160 _get_startup_argv_mode 000000018005a160 f MSVCRTD:argv_mode.obj + 0002:0003b170 __scrt_is_ucrt_dll_in_use 000000018005a170 f MSVCRTD:ucrt_detection.obj + 0002:0003b1a0 _guard_check_icall_nop 000000018005a1a0 f i MSVCRTD:guard_support.obj + 0002:0003b1b0 ReadNoFence64 000000018005a1b0 f i MSVCRTD:guard_support.obj + 0002:0003b1e0 ReadPointerNoFence 000000018005a1e0 f i MSVCRTD:guard_support.obj + 0002:0003b200 __guard_ss_common_verify_stub 000000018005a200 f i MSVCRTD:guard_support.obj + 0002:0003b210 _guard_icall_checks_enforced 000000018005a210 f i MSVCRTD:guard_support.obj + 0002:0003b260 _guard_rf_checks_enforced 000000018005a260 f i MSVCRTD:guard_support.obj + 0002:0003b2b0 memcpy 000000018005a2b0 f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2b6 memset 000000018005a2b6 f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2bc strstr 000000018005a2bc f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2c2 longjmp 000000018005a2c2 f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2c8 memcmp 000000018005a2c8 f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2ce _setjmp 000000018005a2ce f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2ce __intrinsic_setjmp 000000018005a2ce f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2d4 __C_specific_handler 000000018005a2d4 f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2da __std_type_info_destroy_list 000000018005a2da f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2e0 __vcrt_GetModuleFileNameW 000000018005a2e0 f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2e6 __vcrt_GetModuleHandleW 000000018005a2e6 f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2ec __vcrt_LoadLibraryExW 000000018005a2ec f vcruntimed:VCRUNTIME140D.dll + 0002:0003b2f2 _wcsdup 000000018005a2f2 f ucrtd:ucrtbased.dll + 0002:0003b2f8 wcscmp 000000018005a2f8 f ucrtd:ucrtbased.dll + 0002:0003b2fe strcmp 000000018005a2fe f ucrtd:ucrtbased.dll + 0002:0003b304 strlen 000000018005a304 f ucrtd:ucrtbased.dll + 0002:0003b30a strncpy 000000018005a30a f ucrtd:ucrtbased.dll + 0002:0003b310 calloc 000000018005a310 f ucrtd:ucrtbased.dll + 0002:0003b316 free 000000018005a316 f ucrtd:ucrtbased.dll + 0002:0003b31c malloc 000000018005a31c f ucrtd:ucrtbased.dll + 0002:0003b322 strtol 000000018005a322 f ucrtd:ucrtbased.dll + 0002:0003b328 fclose 000000018005a328 f ucrtd:ucrtbased.dll + 0002:0003b32e fopen 000000018005a32e f ucrtd:ucrtbased.dll + 0002:0003b334 fputs 000000018005a334 f ucrtd:ucrtbased.dll + 0002:0003b33a fread 000000018005a33a f ucrtd:ucrtbased.dll + 0002:0003b340 fseek 000000018005a340 f ucrtd:ucrtbased.dll + 0002:0003b346 ftell 000000018005a346 f ucrtd:ucrtbased.dll + 0002:0003b34c __stdio_common_vfprintf 000000018005a34c f ucrtd:ucrtbased.dll + 0002:0003b352 __stdio_common_vsprintf 000000018005a352 f ucrtd:ucrtbased.dll + 0002:0003b358 strtod 000000018005a358 f ucrtd:ucrtbased.dll + 0002:0003b35e acos 000000018005a35e f ucrtd:ucrtbased.dll + 0002:0003b364 asin 000000018005a364 f ucrtd:ucrtbased.dll + 0002:0003b36a atan2 000000018005a36a f ucrtd:ucrtbased.dll + 0002:0003b370 cos 000000018005a370 f ucrtd:ucrtbased.dll + 0002:0003b376 fabs 000000018005a376 f ucrtd:ucrtbased.dll + 0002:0003b37c sin 000000018005a37c f ucrtd:ucrtbased.dll + 0002:0003b382 sqrt 000000018005a382 f ucrtd:ucrtbased.dll + 0002:0003b388 __acrt_iob_func 000000018005a388 f ucrtd:ucrtbased.dll + 0002:0003b38e tan 000000018005a38e f ucrtd:ucrtbased.dll + 0002:0003b394 _dclass 000000018005a394 f ucrtd:ucrtbased.dll + 0002:0003b39a qsort 000000018005a39a f ucrtd:ucrtbased.dll + 0002:0003b3a0 atan 000000018005a3a0 f ucrtd:ucrtbased.dll + 0002:0003b3a6 realloc 000000018005a3a6 f ucrtd:ucrtbased.dll + 0002:0003b3ac exit 000000018005a3ac f ucrtd:ucrtbased.dll + 0002:0003b3b2 strncmp 000000018005a3b2 f ucrtd:ucrtbased.dll + 0002:0003b3b8 atof 000000018005a3b8 f ucrtd:ucrtbased.dll + 0002:0003b3be atoi 000000018005a3be f ucrtd:ucrtbased.dll + 0002:0003b3c4 _wassert 000000018005a3c4 f ucrtd:ucrtbased.dll + 0002:0003b3ca strcpy 000000018005a3ca f ucrtd:ucrtbased.dll + 0002:0003b3d0 roundf 000000018005a3d0 f ucrtd:ucrtbased.dll + 0002:0003b3d6 feof 000000018005a3d6 f ucrtd:ucrtbased.dll + 0002:0003b3dc ferror 000000018005a3dc f ucrtd:ucrtbased.dll + 0002:0003b3e2 __stdio_common_vsscanf 000000018005a3e2 f ucrtd:ucrtbased.dll + 0002:0003b3e8 abs 000000018005a3e8 f ucrtd:ucrtbased.dll + 0002:0003b3ee sqrtf 000000018005a3ee f ucrtd:ucrtbased.dll + 0002:0003b3f4 _errno 000000018005a3f4 f ucrtd:ucrtbased.dll + 0002:0003b3fa __stdio_common_vfwprintf 000000018005a3fa f ucrtd:ucrtbased.dll + 0002:0003b400 fwrite 000000018005a400 f ucrtd:ucrtbased.dll + 0002:0003b406 getc 000000018005a406 f ucrtd:ucrtbased.dll + 0002:0003b40c _CrtDbgReport 000000018005a40c f ucrtd:ucrtbased.dll + 0002:0003b412 _CrtDbgReportW 000000018005a412 f ucrtd:ucrtbased.dll + 0002:0003b418 _initterm 000000018005a418 f ucrtd:ucrtbased.dll + 0002:0003b41e _initterm_e 000000018005a41e f ucrtd:ucrtbased.dll + 0002:0003b424 strcpy_s 000000018005a424 f ucrtd:ucrtbased.dll + 0002:0003b42a strcat_s 000000018005a42a f ucrtd:ucrtbased.dll + 0002:0003b430 __stdio_common_vsprintf_s 000000018005a430 f ucrtd:ucrtbased.dll + 0002:0003b436 _seh_filter_dll 000000018005a436 f ucrtd:ucrtbased.dll + 0002:0003b43c _configure_narrow_argv 000000018005a43c f ucrtd:ucrtbased.dll + 0002:0003b442 _initialize_narrow_environment 000000018005a442 f ucrtd:ucrtbased.dll + 0002:0003b448 _initialize_onexit_table 000000018005a448 f ucrtd:ucrtbased.dll + 0002:0003b44e _register_onexit_function 000000018005a44e f ucrtd:ucrtbased.dll + 0002:0003b454 _execute_onexit_table 000000018005a454 f ucrtd:ucrtbased.dll + 0002:0003b45a _crt_atexit 000000018005a45a f ucrtd:ucrtbased.dll + 0002:0003b460 _crt_at_quick_exit 000000018005a460 f ucrtd:ucrtbased.dll + 0002:0003b466 _cexit 000000018005a466 f ucrtd:ucrtbased.dll + 0002:0003b46c terminate 000000018005a46c f ucrtd:ucrtbased.dll + 0002:0003b472 _wmakepath_s 000000018005a472 f ucrtd:ucrtbased.dll + 0002:0003b478 _wsplitpath_s 000000018005a478 f ucrtd:ucrtbased.dll + 0002:0003b47e wcscpy_s 000000018005a47e f ucrtd:ucrtbased.dll + 0002:0003b484 mkdir 000000018005a484 f ucrtd:ucrtbased.dll + 0002:0003b484 _mkdir 000000018005a484 f ucrtd:ucrtbased.dll + 0002:0003b48a RtlCaptureContext 000000018005a48a f kernel32:KERNEL32.dll + 0002:0003b490 RtlLookupFunctionEntry 000000018005a490 f kernel32:KERNEL32.dll + 0002:0003b496 RtlVirtualUnwind 000000018005a496 f kernel32:KERNEL32.dll + 0002:0003b49c UnhandledExceptionFilter 000000018005a49c f kernel32:KERNEL32.dll + 0002:0003b4a2 SetUnhandledExceptionFilter 000000018005a4a2 f kernel32:KERNEL32.dll + 0002:0003b4a8 TerminateProcess 000000018005a4a8 f kernel32:KERNEL32.dll + 0002:0003b4ae IsProcessorFeaturePresent 000000018005a4ae f kernel32:KERNEL32.dll + 0002:0003b4b4 IsDebuggerPresent 000000018005a4b4 f kernel32:KERNEL32.dll + 0002:0003b4ba RaiseException 000000018005a4ba f kernel32:KERNEL32.dll + 0002:0003b4c0 MultiByteToWideChar 000000018005a4c0 f kernel32:KERNEL32.dll + 0002:0003b4c6 WideCharToMultiByte 000000018005a4c6 f kernel32:KERNEL32.dll + 0002:0003b4cc GetCurrentProcessId 000000018005a4cc f kernel32:KERNEL32.dll + 0002:0003b4d2 GetCurrentThreadId 000000018005a4d2 f kernel32:KERNEL32.dll + 0002:0003b4d8 GetSystemTimeAsFileTime 000000018005a4d8 f kernel32:KERNEL32.dll + 0002:0003b4de DisableThreadLibraryCalls 000000018005a4de f kernel32:KERNEL32.dll + 0002:0003b4e4 InitializeSListHead 000000018005a4e4 f kernel32:KERNEL32.dll + 0002:0003b4ea GetStartupInfoW 000000018005a4ea f kernel32:KERNEL32.dll + 0002:0003b4f0 GetModuleHandleW 000000018005a4f0 f kernel32:KERNEL32.dll + 0002:0003b4f6 HeapAlloc 000000018005a4f6 f kernel32:KERNEL32.dll + 0002:0003b4fc HeapFree 000000018005a4fc f kernel32:KERNEL32.dll + 0002:0003b502 GetProcessHeap 000000018005a502 f kernel32:KERNEL32.dll + 0002:0003b508 VirtualQuery 000000018005a508 f kernel32:KERNEL32.dll + 0002:0003b510 __acrt_initialize 000000018005a510 f MSVCRTD:ucrt_stubs.obj + 0002:0003b510 __scrt_stub_for_acrt_initialize 000000018005a510 f MSVCRTD:ucrt_stubs.obj + 0002:0003b510 __vcrt_initialize 000000018005a510 f MSVCRTD:ucrt_stubs.obj + 0002:0003b520 __acrt_thread_attach 000000018005a520 f MSVCRTD:ucrt_stubs.obj + 0002:0003b520 __scrt_stub_for_acrt_thread_attach 000000018005a520 f MSVCRTD:ucrt_stubs.obj + 0002:0003b520 __vcrt_thread_attach 000000018005a520 f MSVCRTD:ucrt_stubs.obj + 0002:0003b530 __acrt_thread_detach 000000018005a530 f MSVCRTD:ucrt_stubs.obj + 0002:0003b530 __vcrt_thread_detach 000000018005a530 f MSVCRTD:ucrt_stubs.obj + 0002:0003b530 __scrt_stub_for_acrt_thread_detach 000000018005a530 f MSVCRTD:ucrt_stubs.obj + 0002:0003b540 __acrt_uninitialize 000000018005a540 f MSVCRTD:ucrt_stubs.obj + 0002:0003b540 __vcrt_uninitialize 000000018005a540 f MSVCRTD:ucrt_stubs.obj + 0002:0003b540 __scrt_stub_for_acrt_uninitialize 000000018005a540 f MSVCRTD:ucrt_stubs.obj + 0002:0003b550 __scrt_stub_for_acrt_uninitialize_critical 000000018005a550 f MSVCRTD:ucrt_stubs.obj + 0002:0003b550 __vcrt_uninitialize_critical 000000018005a550 f MSVCRTD:ucrt_stubs.obj + 0002:0003b550 __acrt_uninitialize_critical 000000018005a550 f MSVCRTD:ucrt_stubs.obj + 0002:0003b560 _is_c_termination_complete 000000018005a560 f MSVCRTD:ucrt_stubs.obj + 0002:0003b560 __scrt_stub_for_is_c_termination_complete 000000018005a560 f MSVCRTD:ucrt_stubs.obj + 0002:0003cfa0 _guard_dispatch_icall_nop 000000018005bfa0 f MSVCRTD:_guard_dispatch_.obj + 0002:0003cfc0 __guard_ss_verify_failure 000000018005bfc0 f MSVCRTD:_rfgfailure_.obj + 0002:0003cfcb __guard_ss_verify_failure_rcx 000000018005bfcb MSVCRTD:_rfgfailure_.obj + 0002:0003cfd1 __guard_ss_verify_failure_rdx 000000018005bfd1 MSVCRTD:_rfgfailure_.obj + 0002:0003cfd7 __guard_ss_verify_failure_r8 000000018005bfd7 MSVCRTD:_rfgfailure_.obj + 0002:0003cfdd __guard_ss_verify_failure_r9 000000018005bfdd MSVCRTD:_rfgfailure_.obj + 0002:0003cfe3 __guard_ss_verify_failure_r10 000000018005bfe3 MSVCRTD:_rfgfailure_.obj + 0002:0003cff0 __guard_ss_verify_failure_default 000000018005bff0 f MSVCRTD:_rfgfailure_.obj + 0002:0003d050 __guard_ss_verify_sp 000000018005c050 f MSVCRTD:_rfgfailure_.obj + 0002:0003d060 __guard_ss_verify_sp_default 000000018005c060 f MSVCRTD:_rfgfailure_.obj + 0003:00000000 __xc_a 000000018005f000 MSVCRTD:initializers.obj + 0003:00000110 __xc_z 000000018005f110 MSVCRTD:initializers.obj + 0003:00000220 __xi_a 000000018005f220 MSVCRTD:initializers.obj + 0003:00000330 __xi_z 000000018005f330 MSVCRTD:initializers.obj + 0003:00000440 __xp_a 000000018005f440 MSVCRTD:initializers.obj + 0003:00000550 __xp_z 000000018005f550 MSVCRTD:initializers.obj + 0003:00000660 __xt_a 000000018005f660 MSVCRTD:initializers.obj + 0003:00000770 __xt_z 000000018005f770 MSVCRTD:initializers.obj + 0003:00000fb8 ??_C@_07FGKIDIDM@hid?4dll?$AA@ 000000018005ffb8 hid-windows.obj + 0003:00000fc8 ??_C@_0BD@CBOMEPHA@HidD_GetAttributes?$AA@ 000000018005ffc8 hid-windows.obj + 0003:00000fe0 ??_C@_0BL@OEJFEOIE@HidD_GetSerialNumberString?$AA@ 000000018005ffe0 hid-windows.obj + 0003:00001000 ??_C@_0BL@NLNJBEKH@HidD_GetManufacturerString?$AA@ 0000000180060000 hid-windows.obj + 0003:00001020 ??_C@_0BG@NNFFPJLB@HidD_GetProductString?$AA@ 0000000180060020 hid-windows.obj + 0003:00001040 ??_C@_0BA@ENIKBGID@HidD_SetFeature?$AA@ 0000000180060040 hid-windows.obj + 0003:00001058 ??_C@_0BA@FDKFKBMK@HidD_GetFeature?$AA@ 0000000180060058 hid-windows.obj + 0003:00001070 ??_C@_0BG@HBEPJNGD@HidD_GetIndexedString?$AA@ 0000000180060070 hid-windows.obj + 0003:00001090 ??_C@_0BG@NCCNKODK@HidD_GetPreparsedData?$AA@ 0000000180060090 hid-windows.obj + 0003:000010b0 ??_C@_0BH@HPJNKOKM@HidD_FreePreparsedData?$AA@ 00000001800600b0 hid-windows.obj + 0003:000010d0 ??_C@_0N@PAEDFHIM@HidP_GetCaps?$AA@ 00000001800600d0 hid-windows.obj + 0003:000010e0 ??_C@_0BI@HGIMLKHJ@HidD_SetNumInputBuffers?$AA@ 00000001800600e0 hid-windows.obj + 0003:00001100 ??_C@_08POBLEMDG@HIDClass?$AA@ 0000000180060100 hid-windows.obj + 0003:0000110c ??_C@_04MEDFEMKM@?$CGmi_?$AA@ 000000018006010c hid-windows.obj + 0003:00001118 ??_C@_0L@KLBPNCIB@CreateFile?$AA@ 0000000180060118 hid-windows.obj + 0003:00001128 ??_C@_09NOIIIIGM@WriteFile?$AA@ 0000000180060128 hid-windows.obj + 0003:00001138 ??_C@_0BE@LHCFOKBA@GetOverlappedResult?$AA@ 0000000180060138 hid-windows.obj + 0003:00001150 ??_C@_0CE@GNMMJCPJ@Send?5Feature?5Report?5DeviceIoCont@ 0000000180060150 hid-windows.obj + 0003:00001180 ??_C@_0CI@PDMBNDLH@Send?5Feature?5Report?5GetOverLappe@ 0000000180060180 hid-windows.obj + 0003:000015e4 ??_C@_06KJCKIFMC@?$CC?$CFs?$CC?3?$FL?$AA@ 00000001800605e4 json_helpers.obj + 0003:000015ec ??_C@_06LFKFJLAP@?$CFs?$CC?$CFf?$CC?$AA@ 00000001800605ec json_helpers.obj + 0003:000015f8 ??_C@_07KJDLNDKE@?$CFs?$CC?$CFf?$CC?0?$AA@ 00000001800605f8 json_helpers.obj + 0003:00001604 ??_C@_03BAPFIKPP@?$CFs?$FN?$AA@ 0000000180060604 json_helpers.obj + 0003:00001608 ??_C@_09IECGBPDB@?$CC?$CFs?$CC?3?$CC?$CFd?$CC?$AA@ 0000000180060608 json_helpers.obj + 0003:00001618 ??_C@_09IHKCMLFP@?$CC?$CFs?$CC?3?$CC?$CFf?$CC?$AA@ 0000000180060618 json_helpers.obj + 0003:00001628 ??_C@_09JNEPKKME@?$CC?$CFs?$CC?3?$CC?$CFs?$CC?$AA@ 0000000180060628 json_helpers.obj + 0003:00001634 ??_C@_01KDCPPGHE@r?$AA@ 0000000180060634 json_helpers.obj + 0003:00001f08 __real@0000000000000000 0000000180060f08 linmath.obj + 0003:00001f18 __real@38aa95a5c0000000 0000000180060f18 linmath.obj + 0003:00001f28 __real@3e80000000000000 0000000180060f28 linmath.obj + 0003:00001f38 __real@3f50624dd2f1a9fc 0000000180060f38 linmath.obj + 0003:00001f48 __real@3fd0000000000000 0000000180060f48 linmath.obj + 0003:00001f58 __real@3fe0000000000000 0000000180060f58 linmath.obj + 0003:00001f68 __real@3fefffffca501acb 0000000180060f68 linmath.obj + 0003:00001f78 __real@3ff0000000000000 0000000180060f78 linmath.obj + 0003:00001f88 __real@4000000000000000 0000000180060f88 linmath.obj + 0003:00001f98 __real@400921fb5444261e 0000000180060f98 linmath.obj + 0003:00001fa8 __real@bfeffffde0000000 0000000180060fa8 linmath.obj + 0003:00001fb8 __real@bfefffffca501acb 0000000180060fb8 linmath.obj + 0003:00001fc8 __real@bff0000000000000 0000000180060fc8 linmath.obj + 0003:00001fe0 __xmm@80000000000000008000000000000000 0000000180060fe0 linmath.obj + 0003:00002178 ??_C@_0BB@IKGLGKED@NtQuerySemaphore?$AA@ 0000000180061178 os_generic.obj + 0003:00002190 ??_C@_09FLKFJBLM@ntdll?4dll?$AA@ 0000000180061190 os_generic.obj + 0003:000026f9 ??_C@_00CNPNBAHC@?$AA@ 00000001800616f9 symbol_enumerator.obj + 0003:000026fc ??_C@_03EHNAIPEG@?$CK?$CB?$CK?$AA@ 00000001800616fc symbol_enumerator.obj + 0003:00002900 ??_C@_0EN@MLPNKHEM@?7?$CFX?6?7?$CFX?6?7?$CFf?6?7?$CFf?6?7?$CFf?6?7?$CFf?6?7?$CFd?6?7?$CFd?6@ 0000000180061900 ootx_decoder.obj + 0003:00002d38 __real@3ff921fb54442d18 0000000180061d38 poser.obj + 0003:00003620 ??_C@_09MALOBAAJ@?$CFf?5?$CFf?5?$CFf?6?$AA@ 0000000180062620 poser_charlesslow.obj + 0003:00003630 ??_C@_0BK@LDEHLEFM@calinfo?1?$CFd_lighthouse?4dat?$AA@ 0000000180062630 poser_charlesslow.obj + 0003:00003650 ??_C@_02GMLFBBN@wb?$AA@ 0000000180062650 poser_charlesslow.obj + 0003:00003654 ??_C@_02HAOIJKIC@?$CFc?$AA@ 0000000180062654 poser_charlesslow.obj + 0003:00003658 ??_C@_0BE@GGBICEJG@?$CFf?5?$CFf?5?$CFf?5?$CI?$CFf?$CJ?5?$DN?5?$CFf?6?$AA@ 0000000180062658 poser_charlesslow.obj + 0003:00003670 ??_C@_0CD@NDLIGHJL@LH?3?5?$CFd?5?1?5Best?5E?5?$CFf?5Error?5too?5hig@ 0000000180062670 poser_charlesslow.obj + 0003:000036a0 ??_C@_0BB@LNALCBBN@PoserCharlesSlow?$AA@ 00000001800626a0 poser_charlesslow.obj + 0003:000036b4 ??_C@_06PFFCCCHO@?5?$DN?5?$CFf?6?$AA@ 00000001800626b4 poser_charlesslow.obj + 0003:000036c0 __real@3eb0c6f7a0b5ed8d 00000001800626c0 poser_charlesslow.obj + 0003:000036d0 __real@3f1a36e2eb1c432d 00000001800626d0 poser_charlesslow.obj + 0003:000036e0 __real@3fb999999999999a 00000001800626e0 poser_charlesslow.obj + 0003:000036f0 __real@3feccccccccccccd 00000001800626f0 poser_charlesslow.obj + 0003:00003700 __real@3fee147ae147ae14 0000000180062700 poser_charlesslow.obj + 0003:00003710 __real@4010000000000000 0000000180062710 poser_charlesslow.obj + 0003:00003720 __real@4014000000000000 0000000180062720 poser_charlesslow.obj + 0003:00003730 __real@4020000000000000 0000000180062730 poser_charlesslow.obj + 0003:00003740 __real@4024000000000000 0000000180062740 poser_charlesslow.obj + 0003:00003750 __real@402a000000000000 0000000180062750 poser_charlesslow.obj + 0003:00003760 __real@4040000000000000 0000000180062760 poser_charlesslow.obj + 0003:00003770 __real@406fe00000000000 0000000180062770 poser_charlesslow.obj + 0003:00003780 __real@408f400000000000 0000000180062780 poser_charlesslow.obj + 0003:00003790 __real@4415af1d78b58c40 0000000180062790 poser_charlesslow.obj + 0003:000037a0 __real@bf847ae147ae147b 00000001800627a0 poser_charlesslow.obj + 0003:000049b0 ??_C@_0CF@KIPLGGHP@INQUAT?3?5?$CFf?5?$CFf?5?$CFf?5?$CFf?5?$DN?5?$CFf?5?$FL?$CFf?5?$CFf?5@ 00000001800639b0 poser_daveortho.obj + 0003:000049e0 ??_C@_0CD@IDEDNI@QUAT?3?5?$CFf?5?$CFf?5?$CFf?5?$CFf?5?$DN?5?$CFf?5?$FL?$CFf?5?$CFf?5?$CFf@ 00000001800639e0 poser_daveortho.obj + 0003:00004a10 ??_C@_0CF@HGAFKOHK@OUT?5?$CFf?5?$CFf?5?$CFf?5ANGLE?5?$CFf?5?$CFf?5AOUT?5?$CFf@ 0000000180063a10 poser_daveortho.obj + 0003:00004a40 ??_C@_0CF@OJDILADD@OUQUAT?3?5?$CFf?5?$CFf?5?$CFf?5?$CFf?5?$DN?5?$CFf?5?$FL?$CFf?5?$CFf?5@ 0000000180063a40 poser_daveortho.obj + 0003:00004a70 ??_C@_0P@DPGFNLNA@PoserDaveOrtho?$AA@ 0000000180063a70 poser_daveortho.obj + 0003:00004a84 __real@00000000 0000000180063a84 poser_daveortho.obj + 0003:00004a88 __real@3f800000 0000000180063a88 poser_daveortho.obj + 0003:00004a90 __real@40092a550870110a 0000000180063a90 poser_daveortho.obj + 0003:00004aa0 __real@40114d7c6fbd273d 0000000180063aa0 poser_daveortho.obj + 0003:00004ab0 __real@40c3878000000000 0000000180063ab0 poser_daveortho.obj + 0003:00004abc __real@bf800000 0000000180063abc poser_daveortho.obj + 0003:00004ac0 __real@bff3c083126e978d 0000000180063ac0 poser_daveortho.obj + 0003:00004ad0 ??_C@_0L@DELNMONA@PoserDummy?$AA@ 0000000180063ad0 poser_dummy.obj + 0003:00005214 ??_C@_06JGNCCDOK@?5i?$DN?$CFd?5?$AA@ 0000000180064214 poser_octavioradii.obj + 0003:00005220 ??_C@_0BA@KNDBDJPH@radius?$FL?$CFd?$FN?3?5?$CFf?6?$AA@ 0000000180064220 poser_octavioradii.obj + 0003:00005238 ??_C@_0BC@BDNOMNPE@PoserOctavioRadii?$AA@ 0000000180064238 poser_octavioradii.obj + 0003:00005250 __real@3ee4f8b588e368f1 0000000180064250 poser_octavioradii.obj + 0003:00005260 __real@3fd999999999999a 0000000180064260 poser_octavioradii.obj + 0003:00005270 __real@3fe6666666666666 0000000180064270 poser_octavioradii.obj + 0003:00005280 __real@3fefff2e48e8a71e 0000000180064280 poser_octavioradii.obj + 0003:00005290 __real@3ff0cccccccccccd 0000000180064290 poser_octavioradii.obj + 0003:000052a0 __real@3ff921fb5444261e 00000001800642a0 poser_octavioradii.obj + 0003:000052b0 __real@40030a3d70a3d70a 00000001800642b0 poser_octavioradii.obj + 0003:000052c0 __real@4066800000000000 00000001800642c0 poser_octavioradii.obj + 0003:00008920 ??_C@_0BA@ENHGELKH@?5?5?$FL?$CFd?0?5?$CFd?$FN?$CI?$CFf?$CJ?6?$AA@ 0000000180067920 poser_turveytori.obj + 0003:00008938 ??_C@_07PEIEOPOA@?5i?$DN?$CF3d?5?$AA@ 0000000180067938 poser_turveytori.obj + 0003:00008948 ??_C@_0BO@JDLCBPBP@?$HL?$CF?504?44f?0?5?$CF?504?44f?0?5?$CF?504?44f?$HN?5?5?$AA@ 0000000180067948 poser_turveytori.obj + 0003:00008970 ??_C@_07OMBNIAKJ@?5Ri?$DN?$CFd?5?$AA@ 0000000180067970 poser_turveytori.obj + 0003:00008980 ??_C@_0BF@BACOPEF@Ri?$DN?$CF3d?5?5Fitness?$DN?$CF3f?5?$AA@ 0000000180067980 poser_turveytori.obj + 0003:000089a0 ??_C@_0BA@CGEEHMPE@pointcloud2?4pcd?$AA@ 00000001800679a0 poser_turveytori.obj + 0003:000089c0 ??_C@_0EL@LBHPKJCE@?5la?$CI?$CF?504?44f?$CJ?5SnsrCnt?$CI?$CF2d?$CJ?5LhPos?3@ 00000001800679c0 poser_turveytori.obj + 0003:00008a20 ??_C@_0DB@OBHHHCAB@Warning?3?5resetting?5base?5station?5@ 0000000180067a20 poser_turveytori.obj + 0003:00008a60 ??_C@_0CA@FEEDGKE@?5?$DM?$CF?504?44f?0?5?$CF?504?44f?0?5?$CF?504?44f?5?$DO?5?5?$AA@ 0000000180067a60 poser_turveytori.obj + 0003:00008a88 ??_C@_02MDNOOCLA@?$CB?6?$AA@ 0000000180067a88 poser_turveytori.obj + 0003:00008a90 ??_C@_0BA@PBLFNIDJ@TurveyToriDebug?$AA@ 0000000180067a90 poser_turveytori.obj + 0003:00008ab0 ??_C@_0FF@KJJPKMMM@Lighthouse?5Pose?3?5?$FL?$CF1?41x?$FN?$FL?$CF?508?48f@ 0000000180067ab0 poser_turveytori.obj + 0003:00008b18 ??_C@_0M@FGHDCOGM@config?4json?$AA@ 0000000180067b18 poser_turveytori.obj + 0003:00008b28 ??_C@_0BA@FEFKFEPD@PoserTurveyTori?$AA@ 0000000180067b28 poser_turveytori.obj + 0003:00008b40 __real@3e112e0be826d695 0000000180067b40 poser_turveytori.obj + 0003:00008b50 __real@3f947ae147ae147b 0000000180067b50 poser_turveytori.obj + 0003:00008b60 __real@3fc999999999999a 0000000180067b60 poser_turveytori.obj + 0003:00008b70 __real@3fef5c28f5c28f5c 0000000180067b70 poser_turveytori.obj + 0003:00008b80 __real@3fefae147ae147ae 0000000180067b80 poser_turveytori.obj + 0003:00008b90 __real@3ff051eb851eb852 0000000180067b90 poser_turveytori.obj + 0003:00008ba0 __real@3ff0a3d70a3d70a4 0000000180067ba0 poser_turveytori.obj + 0003:00008bb0 __real@400921fb54442d18 0000000180067bb0 poser_turveytori.obj + 0003:00008bc0 __real@4034000000000000 0000000180067bc0 poser_turveytori.obj + 0003:00008bd0 __real@40c3880000000000 0000000180067bd0 poser_turveytori.obj + 0003:00008be0 __real@43e0000000000000 0000000180067be0 poser_turveytori.obj + 0003:00008bf0 __real@43f0000000000000 0000000180067bf0 poser_turveytori.obj + 0003:000091d0 ??_C@_08EINEADGI@REGISTER?$AA@ 00000001800681d0 survive.obj + 0003:000091e0 ??_C@_0L@DCCGFMBN@Error?3?5?$CFs?6?$AA@ 00000001800681e0 survive.obj + 0003:000091f0 ??_C@_09NOJFBOKF@Info?3?5?$CFs?6?$AA@ 00000001800681f0 survive.obj + 0003:00009200 ??_C@_0DH@IAFMHCFK@ERROR?3?5Unpopulated?5ButtonQueueEn@ 0000000180068200 survive.obj + 0003:00009250 ??_C@_0FK@CMGFFOJI@FLT?5type?5incompatible?$DL?5the?5share@ 0000000180068250 survive.obj + 0003:000092bc ??_C@_06BNJCAIGJ@double?$AA@ 00000001800682bc survive.obj + 0003:000092d0 ??_C@_0GN@NEOHEGOJ@Add?5?8?$CDdefine?5FLT?5?$CFs?8?5before?5incl@ 00000001800682d0 survive.obj + 0003:00009358 ??_C@_0N@BHPMBGFO@defaultposer?$AA@ 0000000180068358 survive.obj + 0003:00009368 ??_C@_0BA@GIKAOCAN@lighthousecount?$AA@ 0000000180068368 survive.obj + 0003:00009380 ??_C@_0L@PNEDLDML@configfile?$AA@ 0000000180068380 survive.obj + 0003:00009390 ??_C@_0BN@MMMFJPMH@Error?3?5unknown?5parameter?5?$CFs?6?$AA@ 0000000180068390 survive.obj + 0003:000093b4 ??_C@_03GGODHGCB@no?9?$AA@ 00000001800683b4 survive.obj + 0003:000093b8 ??_C@_0BF@NFAJMNGE@libsurvive?5?9?5usage?3?6?$AA@ 00000001800683b8 survive.obj + 0003:000093d8 ??_C@_0CL@HHCDEINM@?5?9?9?$FLparameter?$FN?5?$FLvalue?$FN?5?5?5?9?5sets?5@ 00000001800683d8 survive.obj + 0003:00009410 ??_C@_0CI@EEPNLDKK@?5?9h?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?5?9?5shows@ 0000000180068410 survive.obj + 0003:00009440 ??_C@_0DJ@NPKCJDCO@?5?9p?5?$FLposer?$FN?5?5?5?5?5?5?5?5?5?5?5?5?5?5?9?5use?5a@ 0000000180068440 survive.obj + 0003:00009490 ??_C@_0EB@HOBIKICD@?5?9l?5?$FLlighthouse?5count?$FN?5?5?5?9?5use?5a@ 0000000180068490 survive.obj + 0003:000094e0 ??_C@_0CM@EMCOHGIM@?5?9c?5?$FLconfig?5file?$FN?5?5?5?5?5?5?5?5?9?5set?5c@ 00000001800684e0 survive.obj + 0003:00009520 ??_C@_0EH@CDGHBJKP@?5?9?9record?5?$FLlog?5file?$FN?5?5?5?5?5?9?5Write@ 0000000180068520 survive.obj + 0003:00009580 ??_C@_0FE@KKKDAGHI@?5?9?9playback?5?$FLlog?5file?$FN?5?5?5?9?5Read?5@ 0000000180068580 survive.obj + 0003:000095f0 ??_C@_0HO@IMALNKJE@?5?9?9playback?9factor?5?$FLf?$FN?5?5?5?9?5Time?5@ 00000001800685f0 survive.obj + 0003:00009688 ??_C@_0O@FDJMKNOD@Available?5?$CFs?3?$AA@ 0000000180068688 survive.obj + 0003:00009698 ??_C@_05HDBEFJDD@?7?$CFc?$CFs?$AA@ 0000000180068698 survive.obj + 0003:000096a0 ??_C@_0CC@JPNLBBCH@Error?4?5?5Cannot?5find?5any?5valid?5?$CFs@ 00000001800686a0 survive.obj + 0003:000096c8 ??_C@_0P@BOKDLJPF@Totals?5?$CFd?5?$CFss?4?$AA@ 00000001800686c8 survive.obj + 0003:000096e0 ??_C@_0BA@CLPBJOPH@Using?5?$CFs?5for?5?$CFs?$AA@ 00000001800686e0 survive.obj + 0003:000096f8 ??_C@_0L@EACKAAOI@TurveyTori?$AA@ 00000001800686f8 survive.obj + 0003:00009708 ??_C@_05HDEOKLPK@Poser?$AA@ 0000000180068708 survive.obj + 0003:00009710 ??_C@_06JDEBPGMM@Turvey?$AA@ 0000000180068710 survive.obj + 0003:00009718 ??_C@_0O@GCIGMBHE@disambiguator?$AA@ 0000000180068718 survive.obj + 0003:00009728 ??_C@_0O@KPOCLJKM@Disambiguator?$AA@ 0000000180068728 survive.obj + 0003:00009738 ??_C@_09MLOCJLEF@DriverReg?$AA@ 0000000180068738 survive.obj + 0003:00009748 ??_C@_0BM@HIBDFKGH@Loading?5driver?5?$CFs?5?$CI?$CFp?$CJ?5?$CI?$CFd?$CJ?$AA@ 0000000180068748 survive.obj + 0003:00009770 ??_C@_0BM@KPEAMBNP@Driver?5?$CFs?5reports?5status?5?$CFd?$AA@ 0000000180068770 survive.obj + 0003:00009798 ??_C@_09PKBBNDCJ@calibrate?$AA@ 0000000180068798 survive.obj + 0003:000097b0 ??_C@_0FP@JHJMECHL@Contradictory?5settings?5?9?9calibra@ 00000001800687b0 survive.obj + 0003:00009830 ??_C@_0KJ@CJOJCMDD@Uncalibrated?5configuration?5detec@ 0000000180068830 survive.obj + 0003:00009900 ??_C@_0EB@PNKBHHLA@Calibration?5requested?4?5Previous?5@ 0000000180068900 survive.obj + 0003:00009950 ??_C@_0M@IDGBGIMB@DriverUnreg?$AA@ 0000000180068950 survive.obj + 0003:00009960 ??_C@_0BO@FLGDPFB@De?9registering?5driver?5?$CFs?5?$CI?$CFp?$CJ?$AA@ 0000000180068960 survive.obj + 0003:00009988 ??_C@_0BN@FGDCGOPP@puff?5returned?5error?5code?5?$CFd?6?$AA@ 0000000180068988 survive.obj + 0003:0000a0b0 ??_C@_0BG@KFMFACMG@Got?5OOTX?5packet?5?$CFd?5?$CFp?$AA@ 00000001800690b0 survive_cal.obj + 0003:0000a0d0 ??_C@_0BC@GAMAGMBC@0?5Not?5calibrating?$AA@ 00000001800690d0 survive_cal.obj + 0003:0000a0e8 ??_C@_0BP@NHDHJDMF@1?5Collecting?5OOTX?5Data?5?$CI?$CFd?3?$CFd?$CJ?$AA@ 00000001800690e8 survive_cal.obj + 0003:0000a110 ??_C@_0BP@KMCMJDPB@?$CFd?5Collecting?5Sweep?5Data?5?$CFd?1?$CFd?$AA@ 0000000180069110 survive_cal.obj + 0003:0000a138 ??_C@_0DD@EMHFAAPD@?$CFd?5Searching?5for?5common?5watchman@ 0000000180069138 survive_cal.obj + 0003:0000a178 ??_C@_0BF@OLBJOIHL@?$CFd?5LH?5Find?5complete?4?$AA@ 0000000180069178 survive_cal.obj + 0003:0000a198 ??_C@_0BM@PDBOOFIA@?$CFd?5Unkown?5calibration?5state?$AA@ 0000000180069198 survive_cal.obj + 0003:0000a1c0 ??_C@_0EE@GENMPMIB@Error?3?5You?5cannot?5install?5a?5cali@ 00000001800691c0 survive_cal.obj + 0003:0000a218 ??_C@_0BH@KHPKFBGE@requiredtrackersforcal?$AA@ 0000000180069218 survive_cal.obj + 0003:0000a238 ??_C@_0BH@HLFPIMAF@allowalltrackersforcal?$AA@ 0000000180069238 survive_cal.obj + 0003:0000a258 ??_C@_0BI@KIFKOBMI@Calibration?5is?5using?5?$CFs?$AA@ 0000000180069258 survive_cal.obj + 0003:0000a280 ??_C@_0EF@KOABCDHO@Calibration?5is?5NOT?5using?5?$CFs?$DL?5dev@ 0000000180069280 survive_cal.obj + 0003:0000a2d8 ??_C@_0DK@DDAJLGNL@Error?3?5Did?5not?5find?5all?5devices?5@ 00000001800692d8 survive_cal.obj + 0003:0000a320 ??_C@_0M@EDPHBABA@configposer?$AA@ 0000000180069320 survive_cal.obj + 0003:0000a330 ??_C@_0CE@GJBPMKNN@Stage?52?5moving?5to?5stage?53?4?5?$CFd?5?$CFd@ 0000000180069330 survive_cal.obj + 0003:0000a360 ??_C@_0CE@IONDCGBK@Stage?52?5good?5?9?5continuing?4?5?$CFd?5?$CFd@ 0000000180069360 survive_cal.obj + 0003:0000a390 ??_C@_0CA@KFOHGJCB@Stage?52?5bad?5?9?5redoing?4?5?$CFd?5?$CFd?5?$CFd?$AA@ 0000000180069390 survive_cal.obj + 0003:0000a3b8 ??_C@_07HHKKFKEI@calinfo?$AA@ 00000001800693b8 survive_cal.obj + 0003:0000a3c4 ??_C@_01NOFIACDB@w?$AA@ 00000001800693c4 survive_cal.obj + 0003:0000a3c8 ??_C@_0BF@IDNJLCLO@calinfo?1synctime?4csv?$AA@ 00000001800693c8 survive_cal.obj + 0003:0000a3e8 ??_C@_0BA@OJJOEMFE@?$CFd?5?$CFd?5?$CFf?5?$CFd?5?$CFf?6?$AA@ 00000001800693e8 survive_cal.obj + 0003:0000a400 ??_C@_0BH@LCCICMPC@calinfo?1histograms?4csv?$AA@ 0000000180069400 survive_cal.obj + 0003:0000a420 ??_C@_0BD@CCFCMNJP@calinfo?1ptinfo?4csv?$AA@ 0000000180069420 survive_cal.obj + 0003:0000a438 ??_C@_09KNAFKOHB@DPAVG?5?$CFd?6?$AA@ 0000000180069438 survive_cal.obj + 0003:0000a448 ??_C@_0DO@PMCDGBGI@DROPPED?3?5?$CF02d?3?$CFd?3?$CFd?5dropped?5beca@ 0000000180069448 survive_cal.obj + 0003:0000a498 ??_C@_0N@GFBDEKAP@?$CF02d_?$CFd_?$CFd?0?5?$AA@ 0000000180069498 survive_cal.obj + 0003:0000a4a8 ??_C@_03JDANDILB@?$CFd?5?$AA@ 00000001800694a8 survive_cal.obj + 0003:0000a4ac ??_C@_01EEMJAFIK@?6?$AA@ 00000001800694ac survive_cal.obj + 0003:0000a4b0 ??_C@_0BP@GCAFAGNO@?$CFd?5?$CFd?5?$CFd?5?$CFd?5?$CFf?5?$CFf?5?$CFf?5?$CFf?5?$CFf?5?$CFf?6?$AA@ 00000001800694b0 survive_cal.obj + 0003:0000a4d8 ??_C@_0BF@IJCAPDKK@calinfo?1objposes?4csv?$AA@ 00000001800694d8 survive_cal.obj + 0003:0000a4f8 ??_C@_0BO@HLDAFIGC@Failed?5calibration?5on?5dev?5?$CFd?6?$AA@ 00000001800694f8 survive_cal.obj + 0003:0000a520 ??_C@_0BG@FJPIFNFB@ComputeReprojectError?$AA@ 0000000180069520 survive_cal.obj + 0003:0000a540 ??_C@_0N@MDOCIACE@?$CFf?5?$CFf?5?$CFf?5?$CFf?6?$AA@ 0000000180069540 survive_cal.obj + 0003:0000a550 ??_C@_0CM@JOKMCDHA@Reproject?5error?5was?5?$CF?413g?5for?5li@ 0000000180069550 survive_cal.obj + 0003:0000a588 ??_C@_0BD@KAPCDDML@Stage?54?5succeeded?4?$AA@ 0000000180069588 survive_cal.obj + 0003:0000a5a0 __real@3ee078921ac6c11f 00000001800695a0 survive_cal.obj + 0003:0000a5b0 __real@402f000000000000 00000001800695b0 survive_cal.obj + 0003:0000a5c0 __real@412e848000000000 00000001800695c0 survive_cal.obj + 0003:0000a5d0 __real@41cdcd6500000000 00000001800695d0 survive_cal.obj + 0003:0000a720 ??_C@_0EF@CHFOKBJC@SEVERE?5WARNING?3?5Pulse?5codes?5for?5@ 0000000180069720 survive_charlesbiguator.obj + 0003:0000a778 ??_C@_0DG@DJLMANJP@Warning?4?5?5Received?5an?5extra?0?5una@ 0000000180069778 survive_charlesbiguator.obj + 0003:0000a7b8 ??_C@_0BF@JONNKFNC@DisambiguatorCharles?$AA@ 00000001800697b8 survive_charlesbiguator.obj + 0003:0000aa20 ??_C@_1EK@DDDFAJGG@?$AAp?$AA?3?$AA?2?$AAc?$AA?2?$AAl?$AAi?$AAb?$AAs?$AAu?$AAr?$AAv?$AAi?$AAv?$AAe?$AA?2?$AAs?$AAr?$AAc?$AA?2?$AAs?$AAu?$AAr?$AAv?$AAi?$AAv?$AAe?$AA_?$AAc?$AAo?$AAn?$AAf@ 0000000180069a20 survive_config.obj + 0003:0000aa78 ??_C@_1BI@JNDFFBDE@?$AAp?$AAt?$AAr?$AA?5?$AA?$CB?$AA?$DN?$AA?5?$AAN?$AAU?$AAL?$AAL?$AA?$AA@ 0000000180069a78 survive_config.obj + 0003:0000aa94 ??_C@_05FKHKFDID@index?$AA@ 0000000180069a94 survive_config.obj + 0003:0000aa9c ??_C@_02EGCJHIOB@id?$AA@ 0000000180069a9c survive_config.obj + 0003:0000aaa0 ??_C@_04ONHHEGJD@pose?$AA@ 0000000180069aa0 survive_config.obj + 0003:0000aaa8 ??_C@_09JKPCDAKL@fcalphase?$AA@ 0000000180069aa8 survive_config.obj + 0003:0000aab8 ??_C@_08HKPOEMGH@fcaltilt?$AA@ 0000000180069ab8 survive_config.obj + 0003:0000aac8 ??_C@_09MDKHCJDH@fcalcurve?$AA@ 0000000180069ac8 survive_config.obj + 0003:0000aad8 ??_C@_0L@JJAOFDO@fcalgibpha?$AA@ 0000000180069ad8 survive_config.obj + 0003:0000aae8 ??_C@_0L@PCGIPGHF@fcalgibmag?$AA@ 0000000180069ae8 survive_config.obj + 0003:0000aaf8 ??_C@_0M@KDKAPPIM@PositionSet?$AA@ 0000000180069af8 survive_config.obj + 0003:0000ab08 ??_C@_1BK@IGDBEDLK@?$AAd?$AAe?$AAs?$AAt?$AA?5?$AA?$CB?$AA?$DN?$AA?5?$AAN?$AAU?$AAL?$AAL?$AA?$AA@ 0000000180069b08 survive_config.obj + 0003:0000ab28 ??_C@_07LHGBCHHD@?$CC?$CFs?$CC?3?$HL?6?$AA@ 0000000180069b28 survive_config.obj + 0003:0000ab34 ??_C@_01IHBHIGKO@?0?$AA@ 0000000180069b34 survive_config.obj + 0003:0000ab38 ??_C@_02KGHIDFGE@?$HN?6?$AA@ 0000000180069b38 survive_config.obj + 0003:0000ab40 ??_C@_0M@OGGIPDID@lighthouse0?$AA@ 0000000180069b40 survive_config.obj + 0003:0000ab50 ??_C@_0M@PPHDMCMC@lighthouse1?$AA@ 0000000180069b50 survive_config.obj + 0003:0000ab60 ??_C@_07OBCDKDLF@?$CFs?3?$CFs?5?6?$AA@ 0000000180069b60 survive_config.obj + 0003:0000afb0 ??_C@_03GMEMMEKD@HMD?$AA@ 0000000180069fb0 survive_default_devices.obj + 0003:0000afb4 ??_C@_03CPGFDPJI@WM0?$AA@ 0000000180069fb4 survive_default_devices.obj + 0003:0000afb8 ??_C@_03DGHOAONJ@WM1?$AA@ 0000000180069fb8 survive_default_devices.obj + 0003:0000afbc ??_C@_03CKKKHEDL@TR0?$AA@ 0000000180069fbc survive_default_devices.obj + 0003:0000afc0 ??_C@_03DONEBJDO@WW0?$AA@ 0000000180069fc0 survive_default_devices.obj + 0003:0000afc8 ??_C@_0BF@IPEIPOCE@Parse?5error?5in?5JSON?6?$AA@ 0000000180069fc8 survive_default_devices.obj + 0003:0000afe8 ??_C@_0CP@CPLEIJDA@Failed?5to?5parse?5JSON?5in?5HMD?5conf@ 0000000180069fe8 survive_default_devices.obj + 0003:0000b020 ??_C@_0CG@JGALMBLM@Object?5expected?5in?5HMD?5configura@ 000000018006a020 survive_default_devices.obj + 0003:0000b050 ??_C@_0M@HKABMIBA@modelPoints?$AA@ 000000018006a050 survive_default_devices.obj + 0003:0000b060 ??_C@_0N@COOCNDOI@modelNormals?$AA@ 000000018006a060 survive_default_devices.obj + 0003:0000b070 ??_C@_08KDNHCCDC@acc_bias?$AA@ 000000018006a070 survive_default_devices.obj + 0003:0000b080 ??_C@_09EFLODEJC@acc_scale?$AA@ 000000018006a080 survive_default_devices.obj + 0003:0000b090 ??_C@_09PFMGPKEL@gyro_bias?$AA@ 000000018006a090 survive_default_devices.obj + 0003:0000b0a0 ??_C@_0L@GMDBOMNC@gyro_scale?$AA@ 000000018006a0a0 survive_default_devices.obj + 0003:0000b0b0 ??_C@_0BG@NOPIFPMG@calinfo?1?$CFs_points?4csv?$AA@ 000000018006a0b0 survive_default_devices.obj + 0003:0000b0d0 ??_C@_0BH@OLDKPIFP@calinfo?1?$CFs_normals?4csv?$AA@ 000000018006a0d0 survive_default_devices.obj + 0003:0000b0f0 __real@3fc0000000000000 000000018006a0f0 survive_default_devices.obj + 0003:0000b100 ??_C@_0BC@JCAJPOLD@Drivers?5?$CI?$CFd?1?$CFd?$CJ?3?6?$AA@ 000000018006a100 survive_driverman.obj + 0003:0000b118 ??_C@_04MDKIEGGJ@?5?$CFs?6?$AA@ 000000018006a118 survive_driverman.obj + 0003:0000bf38 ??_C@_06IJADJEDP@?$CF0?46f?5?$AA@ 000000018006af38 survive_playback.obj + 0003:0000bf40 ??_C@_0BA@CFNOHJCL@?$CFs?5CONFIG?5?$CF?4?$CKs?6?$AA@ 000000018006af40 survive_playback.obj + 0003:0000bf58 ??_C@_0DG@NPNKBGBD@?$CFd?5LH_POSE?5?$CF0?46f?5?$CF0?46f?5?$CF0?46f?5?$CF0?4@ 000000018006af58 survive_playback.obj + 0003:0000bf98 ??_C@_0DD@HKKGMMLM@?$CFs?5POSE?5?$CF0?46f?5?$CF0?46f?5?$CF0?46f?5?$CF0?46f?5@ 000000018006af98 survive_playback.obj + 0003:0000bfd8 ??_C@_0N@OECFONJP@INFO?5LOG?5?$CFs?6?$AA@ 000000018006afd8 survive_playback.obj + 0003:0000bfe8 ??_C@_0BO@KOOLOIN@?$CFs?5A?5?$CFd?5?$CFd?5?$CFu?5?$CF0?46f?5?$CF0?46f?5?$CFu?6?$AA@ 000000018006afe8 survive_playback.obj + 0003:0000c010 ??_C@_0P@BOGAIJKL@?$CFs?5C?5?$CFd?5?$CFu?5?$CFu?6?$AA@ 000000018006b010 survive_playback.obj + 0003:0000c028 ??_C@_0BI@PLIBJGN@?$CFs?5S?5?$CFd?5?$CFd?5?$CFd?5?$CFu?5?$CFu?5?$CFu?6?$AA@ 000000018006b028 survive_playback.obj + 0003:0000c044 ??_C@_01OCOKONAJ@L?$AA@ 000000018006b044 survive_playback.obj + 0003:0000c048 ??_C@_01MMEEDKFM@X?$AA@ 000000018006b048 survive_playback.obj + 0003:0000c04c ??_C@_01NFFPALBN@Y?$AA@ 000000018006b04c survive_playback.obj + 0003:0000c050 ??_C@_01DGKLNCNG@R?$AA@ 000000018006b050 survive_playback.obj + 0003:0000c058 ??_C@_0BM@MICFPCFN@?$CFs?5?$CFs?5?$CFs?5?$CFd?5?$CFd?5?$CFd?5?$CFu?5?$CFu?5?$CFu?6?$AA@ 000000018006b058 survive_playback.obj + 0003:0000c080 ??_C@_0DD@MPHJPBDA@?$CFs?5I?5?$CFd?5?$CFu?5?$CF0?46f?5?$CF0?46f?5?$CF0?46f?5?$CF0?4@ 000000018006b080 survive_playback.obj + 0003:0000c0c0 ??_C@_0CF@KAEKKPOM@?$CFs?5I?5?$CFd?5?$CFd?5?$CFlf?5?$CFlf?5?$CFlf?5?$CFlf?5?$CFlf?5?$CF@ 000000018006b0c0 survive_playback.obj + 0003:0000c0f0 ??_C@_0DB@HADOADIB@Warning?3?5?5On?5line?5?$CFd?0?5only?5?$CFd?5va@ 000000018006b0f0 survive_playback.obj + 0003:0000c130 ??_C@_0CP@IOOMEKIN@Could?5not?5find?5device?5named?5?$CFs?5f@ 000000018006b130 survive_playback.obj + 0003:0000c168 ??_C@_0BD@CIBCCKLL@?$CFs?5?$CFs?5?$CFhhu?5?$CFu?5?$CFhu?6?$AA@ 000000018006b168 survive_playback.obj + 0003:0000c180 ??_C@_0BP@LCPMFCLE@?$CF8s?5?$CF8s?5?$CF8s?5?$CFu?5?$CFd?5?$CFd?5?$CFd?5?$CFu?5?$CFu?6?$AA@ 000000018006b180 survive_playback.obj + 0003:0000c1a8 ??_C@_03DLDNIBIK@?$CFlf?$AA@ 000000018006b1a8 survive_playback.obj + 0003:0000c1b0 ??_C@_07EFDGDGOL@?$CF8s?5?$CF8s?$AA@ 000000018006b1b0 survive_playback.obj + 0003:0000c1bc ??_C@_06KKGOIHDP@record?$AA@ 000000018006b1bc survive_playback.obj + 0003:0000c1c8 ??_C@_0O@GAJEBDOB@record?9stdout?$AA@ 000000018006b1c8 survive_playback.obj + 0003:0000c1d8 ??_C@_0BO@KIFNPJFO@Could?5not?5open?5?$CFs?5for?5writing?$AA@ 000000018006b1d8 survive_playback.obj + 0003:0000c200 ??_C@_0BC@HBIFKMMJ@Recording?5to?5?8?$CFs?8?$AA@ 000000018006b200 survive_playback.obj + 0003:0000c218 ??_C@_0BE@EABJMJLO@Recording?5to?5stdout?$AA@ 000000018006b218 survive_playback.obj + 0003:0000c230 ??_C@_0BA@NKHCJIIO@record?9rawlight?$AA@ 000000018006b230 survive_playback.obj + 0003:0000c248 ??_C@_08MDANPFHG@playback?$AA@ 000000018006b248 survive_playback.obj + 0003:0000c258 ??_C@_0BA@HLHPJHHK@playback?9factor?$AA@ 000000018006b258 survive_playback.obj + 0003:0000c270 ??_C@_0CH@EACECBPB@Could?5not?5open?5playback?5events?5f@ 000000018006b270 survive_playback.obj + 0003:0000c2a0 ??_C@_0CP@HJAKMBHP@Using?5playback?5file?5?8?$CFs?8?5with?5ti@ 000000018006b2a0 survive_playback.obj + 0003:0000c2d8 ??_C@_08EBPMHHNF@Playback?$AA@ 000000018006b2d8 survive_playback.obj + 0003:0000c2e8 ??_C@_09KFNKLCJH@?$CFlf?5?$CFs?5?$CFs?$AA@ 000000018006b2e8 survive_playback.obj + 0003:0000c2f4 ??_C@_06HALBHJJI@CONFIG?$AA@ 000000018006b2f4 survive_playback.obj + 0003:0000c300 ??_C@_0BN@CNOJPLOI@Found?5?$CFs?5in?5playback?5file?4?4?4?$AA@ 000000018006b300 survive_playback.obj + 0003:0000c328 ??_C@_0BC@BBPBBBII@DriverRegPlayback?$AA@ 000000018006b328 survive_playback.obj + 0003:0000c4b8 __real@400921fb54442eea 000000018006b4b8 survive_process.obj + 0003:0000c9d0 ??_C@_0CB@CKJGJFAK@Initializing?5Disambiguator?5Data?6@ 000000018006b9d0 survive_turveybiguator.obj + 0003:0000c9f8 ??_C@_0BE@CMIJPOFD@DisambiguatorTurvey?$AA@ 000000018006b9f8 survive_turveybiguator.obj + 0003:0000ca10 vidpids 000000018006ba10 survive_vive.obj + 0003:0000ca68 ??_C@_0N@IJHOEBGN@HMD?5IMU?5?$CG?5LH?$AA@ 000000018006ba68 survive_vive.obj + 0003:0000ca78 ??_C@_0L@IFHLFNOC@Watchman?51?$AA@ 000000018006ba78 survive_vive.obj + 0003:0000ca88 ??_C@_0L@KOFGAOCB@Watchman?52?$AA@ 000000018006ba88 survive_vive.obj + 0003:0000ca98 ??_C@_09MBBMLDBF@Tracker?50?$AA@ 000000018006ba98 survive_vive.obj + 0003:0000caa8 ??_C@_0BB@NJHDPPGB@Wired?5Watchman?51?$AA@ 000000018006baa8 survive_vive.obj + 0003:0000cac0 ??_C@_0N@IOFKFGME@HMD?5Lightcap?$AA@ 000000018006bac0 survive_vive.obj + 0003:0000cad0 ??_C@_0BD@JFOGJMNN@Tracker?50?5Lightcap?$AA@ 000000018006bad0 survive_vive.obj + 0003:0000cae8 ??_C@_0BK@NEOAGFFM@Wired?5Watchman?51?5Lightcap?$AA@ 000000018006bae8 survive_vive.obj + 0003:0000cb08 ??_C@_0M@NGCOJBIB@HMD?5Buttons?$AA@ 000000018006bb08 survive_vive.obj + 0003:0000cb18 ??_C@_0BC@GLEBPDNE@Tracker?50?5Buttons?$AA@ 000000018006bb18 survive_vive.obj + 0003:0000cb30 ??_C@_0BJ@GJMCBCHP@Wired?5Watchman?51?5Buttons?$AA@ 000000018006bb30 survive_vive.obj + 0003:0000dc30 ??_C@_0BO@GNDEFIGE@Vive?5starting?5in?5HIDAPI?5mode?4?$AA@ 000000018006cc30 survive_vive.obj + 0003:0000dc58 ??_C@_0BI@HMFKJHBF@Could?5not?5setup?5hidapi?4?$AA@ 000000018006cc58 survive_vive.obj + 0003:0000dc78 ??_C@_0CO@LGPNOFEN@Warning?3?5Could?5not?5find?5vive?5dev@ 000000018006cc78 survive_vive.obj + 0003:0000dcb0 ??_C@_0L@FKJFHLNP@Found?5?$CFs?4?5?$AA@ 000000018006ccb0 survive_vive.obj + 0003:0000dcc0 ??_C@_1HG@OMNBABAK@?$AAS?$AAe?$AAr?$AAi?$AAa?$AAl?$AA?5?$AAN?$AAu?$AAm?$AAb?$AAe?$AAr?$AA?5?$AAS?$AAt?$AAr?$AAi?$AAn?$AAg?$AA?3?$AA?5?$AA?$CI?$AA?$CF?$AAd?$AA?$CJ?$AA?5?$AA?$CF?$AAs?$AA?5?$AAf?$AAo@ 000000018006ccc0 survive_vive.obj + 0003:0000dd50 ??_C@_09KDCEMOGA@Mainboard?$AA@ 000000018006cd50 survive_vive.obj + 0003:0000dd60 ??_C@_0L@KLOKDNDE@Lighthouse?$AA@ 000000018006cd60 survive_vive.obj + 0003:0000dd70 ??_C@_09NIAHICFE@Tracker?51?$AA@ 000000018006cd70 survive_vive.obj + 0003:0000dd80 ??_C@_08HKJJJIN@Lightcap?$AA@ 000000018006cd80 survive_vive.obj + 0003:0000dd90 ??_C@_0BD@FEGIEDBN@Tracker?51?5Lightcap?$AA@ 000000018006cd90 survive_vive.obj + 0003:0000dda8 ??_C@_0BC@IEIDJIOK@Tracker?51?5Buttons?$AA@ 000000018006cda8 survive_vive.obj + 0003:0000ddc0 ??_C@_0BJ@GNOJMMKN@Wired?5Watchman?51?5BUTTONS?$AA@ 000000018006cdc0 survive_vive.obj + 0003:0000dde0 ??_C@_0CB@PEHHEGLK@All?5enumerated?5devices?5attached?4@ 000000018006cde0 survive_vive.obj + 0003:0000de08 ??_C@_0BB@IBIEENJM@Powered?5unit?5on?4?$AA@ 000000018006ce08 survive_vive.obj + 0003:0000de20 ??_C@_07MHAKDOJN@UCR?3?5?$CFd?$AA@ 000000018006ce20 survive_vive.obj + 0003:0000de30 ??_C@_0CK@MKDBHBNJ@HAPTIC?5FAILED?5?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK?$CK@ 000000018006ce30 survive_vive.obj + 0003:0000de68 ??_C@_0DD@CJACFCOE@Could?5not?5get?5survive?5config?5dat@ 000000018006ce68 survive_vive.obj + 0003:0000deb0 ??_C@_0EN@MNNBGJOI@Could?5not?5read?5config?5data?5?$CIafte@ 000000018006ceb0 survive_vive.obj + 0003:0000df10 ??_C@_0EG@GAMFNDJM@Too?5much?5data?5?$CI?$CFd?$CJ?5on?5packet?5fro@ 000000018006cf10 survive_vive.obj + 0003:0000df68 ??_C@_0DA@OGKLBGCL@Configuration?5length?5too?5long?5?$CFd@ 000000018006cf68 survive_vive.obj + 0003:0000dfa8 ??_C@_0BO@KGIBCPAH@Empty?5configuration?5for?5?$CFd?3?$CFd?$AA@ 000000018006cfa8 survive_vive.obj + 0003:0000dfd0 ??_C@_0BK@MAFELOBD@Got?5config?5data?5length?5?$CFd?$AA@ 000000018006cfd0 survive_vive.obj + 0003:0000dff0 ??_C@_0BD@IBFNHCEF@calinfo?1?$CFd?4json?4gz?$AA@ 000000018006cff0 survive_vive.obj + 0003:0000e008 ??_C@_0DF@EBMEFDHK@Error?3?5data?5for?5config?5descripto@ 000000018006d008 survive_vive.obj + 0003:0000e048 ??_C@_0BJ@FCIOLMDO@Light?5decoding?5fault?3?5?$CFd?$AA@ 000000018006d048 survive_vive.obj + 0003:0000e068 ??_C@_0BK@OMCGCPDF@Unknown?5watchman?5code?5?$CFd?6?$AA@ 000000018006d068 survive_vive.obj + 0003:0000e088 ??_C@_0BD@IMJODLNK@Loading?5config?3?5?$CFd?$AA@ 000000018006d088 survive_vive.obj + 0003:0000e0a0 ??_C@_0P@PJMDBPCL@?$CFs_config?4json?$AA@ 000000018006d0a0 survive_vive.obj + 0003:0000e0b8 ??_C@_0CJ@IIFFGGFF@Playback?5is?5active?$DL?5disabling?5US@ 000000018006d0b8 survive_vive.obj + 0003:0000e0ec ??_C@_03DAPKMKJL@HTC?$AA@ 000000018006d0ec survive_vive.obj + 0003:0000e0f0 ??_C@_0BI@PHMHMBK@No?5USB?5devices?5detected?$AA@ 000000018006d0f0 survive_vive.obj + 0003:0000e110 ??_C@_0BC@HAOBPHKB@HMD?5config?5issue?4?$AA@ 000000018006d110 survive_vive.obj + 0003:0000e128 ??_C@_0BJ@KNAOLLDL@Watchman?50?5config?5issue?4?$AA@ 000000018006d128 survive_vive.obj + 0003:0000e148 ??_C@_0BJ@DGGCKKK@Watchman?51?5config?5issue?4?$AA@ 000000018006d148 survive_vive.obj + 0003:0000e168 ??_C@_0BI@GBJDMANO@Tracker?50?5config?5issue?4?$AA@ 000000018006d168 survive_vive.obj + 0003:0000e188 ??_C@_0BP@FFPMJDLG@Wired?5Watchman?50?5config?5issue?4?$AA@ 000000018006d188 survive_vive.obj + 0003:0000e1b0 ??_C@_0BB@IPGPCEDK@DriverRegHTCVive?$AA@ 000000018006d1b0 survive_vive.obj + 0003:0000e1c8 __real@3f20000000000000 000000018006d1c8 survive_vive.obj + 0003:0000e1d8 __real@3f41740a00000000 000000018006d1d8 survive_vive.obj + 0003:0000e1e8 __real@3f70101020000000 000000018006d1e8 survive_vive.obj + 0003:0000e210 _pDefaultRawDllMain 000000018006d210 MSVCRTD:dll_dllmain.obj + 0003:0000e210 _pRawDllMain 000000018006d210 MSVCRTD:dll_dllmain.obj + 0003:0000e250 ??_C@_0BJ@HEGAHDFO@Stack?5pointer?5corruption?$AA@ 000000018006d250 MSVCRTD:_userapi_.obj + 0003:0000e270 ??_C@_0CK@FEGOIOPB@Cast?5to?5smaller?5type?5causing?5los@ 000000018006d270 MSVCRTD:_userapi_.obj + 0003:0000e2a8 ??_C@_0BI@CIGMDCBH@Stack?5memory?5corruption?$AA@ 000000018006d2a8 MSVCRTD:_userapi_.obj + 0003:0000e2c8 ??_C@_0CK@CNLNOEPB@Local?5variable?5used?5before?5initi@ 000000018006d2c8 MSVCRTD:_userapi_.obj + 0003:0000e300 ??_C@_0BP@OGBCLIBO@Stack?5around?5_alloca?5corrupted?$AA@ 000000018006d300 MSVCRTD:_userapi_.obj + 0003:0000e410 ??_C@_0NN@NGPKDKPD@The?5value?5of?5ESP?5was?5not?5properl@ 000000018006d410 MSVCRTD:_error_.obj + 0003:0000e520 ??_C@_0BBN@GPMLNJCF@A?5cast?5to?5a?5smaller?5data?5type?5ha@ 000000018006d520 MSVCRTD:_error_.obj + 0003:0000e678 ??_C@_0BN@FFOINMNJ@Stack?5memory?5was?5corrupted?6?$AN?$AA@ 000000018006d678 MSVCRTD:_error_.obj + 0003:0000e6a0 ??_C@_0DG@HKJMLLLP@A?5local?5variable?5was?5used?5before@ 000000018006d6a0 MSVCRTD:_error_.obj + 0003:0000e6e0 ??_C@_0CM@NGINOKPC@Stack?5memory?5around?5_alloca?5was?5@ 000000018006d6e0 MSVCRTD:_error_.obj + 0003:0000e718 ??_C@_0BO@GNIAFIKK@Unknown?5Runtime?5Check?5Error?6?$AN?$AA@ 000000018006d718 MSVCRTD:_error_.obj + 0003:0000e740 ??_C@_1GM@OLMCBDMB@?$AAR?$AAu?$AAn?$AAt?$AAi?$AAm?$AAe?$AA?5?$AAC?$AAh?$AAe?$AAc?$AAk?$AA?5?$AAE?$AAr?$AAr?$AAo?$AAr?$AA?4?$AA?6?$AA?$AN?$AA?5?$AAU?$AAn?$AAa?$AAb?$AAl?$AAe?$AA?5?$AAt?$AAo@ 000000018006d740 MSVCRTD:_error_.obj + 0003:0000e7d0 ??_C@_1EA@NFKNIFJP@?$AAR?$AAu?$AAn?$AA?9?$AAT?$AAi?$AAm?$AAe?$AA?5?$AAC?$AAh?$AAe?$AAc?$AAk?$AA?5?$AAF?$AAa?$AAi?$AAl?$AAu?$AAr?$AAe?$AA?5?$AA?$CD?$AA?$CF?$AAd?$AA?5?$AA?9?$AA?5?$AA?$CF?$AAs?$AA?$AA@ 000000018006d7d0 MSVCRTD:_error_.obj + 0003:0000e820 ??_C@_0BB@PFFGGCJP@Unknown?5Filename?$AA@ 000000018006d820 MSVCRTD:_error_.obj + 0003:0000e838 ??_C@_0BE@GNBOBNCK@Unknown?5Module?5Name?$AA@ 000000018006d838 MSVCRTD:_error_.obj + 0003:0000e850 ??_C@_0CA@IODNCDPG@Run?9Time?5Check?5Failure?5?$CD?$CFd?5?9?5?$CFs?$AA@ 000000018006d850 MSVCRTD:_error_.obj + 0003:0000e878 ??_C@_0CG@IAFNJNEE@Stack?5corrupted?5near?5unknown?5var@ 000000018006d878 MSVCRTD:_error_.obj + 0003:0000e8a8 ??_C@_05MKKEDADM@?$CF?42X?5?$AA@ 000000018006d8a8 MSVCRTD:_error_.obj + 0003:0000e8b0 ??_C@_0EJ@LJKNEOLN@Stack?5area?5around?5_alloca?5memory@ 000000018006d8b0 MSVCRTD:_error_.obj + 0003:0000e908 ??_C@_02LLMPMKNF@?$DO?5?$AA@ 000000018006d908 MSVCRTD:_error_.obj + 0003:0000e910 ??_C@_08OMAHNMHJ@?6Data?3?5?$DM?$AA@ 000000018006d910 MSVCRTD:_error_.obj + 0003:0000e920 ??_C@_0CK@DKGBICFE@?6Allocation?5number?5within?5this?5f@ 000000018006d920 MSVCRTD:_error_.obj + 0003:0000e958 ??_C@_07DFDJCKFN@?6Size?3?5?$AA@ 000000018006d958 MSVCRTD:_error_.obj + 0003:0000e968 ??_C@_0N@MHFFIMFG@?6Address?3?50x?$AA@ 000000018006d968 MSVCRTD:_error_.obj + 0003:0000e980 ??_C@_0EI@CLEPFNGI@Stack?5area?5around?5_alloca?5memory@ 000000018006d980 MSVCRTD:_error_.obj + 0003:0000e9d8 ??_C@_0BK@ODNDAGKB@?$CFs?$CFs?$CFp?$CFs?$CFzd?$CFs?$CFd?$CFs?$CFs?$CFs?$CFs?$CFs?$AA@ 000000018006d9d8 MSVCRTD:_error_.obj + 0003:0000e9f8 ??_C@_0DE@OHJBPMBP@A?5variable?5is?5being?5used?5without@ 000000018006d9f8 MSVCRTD:_error_.obj + 0003:0000eaa0 ??_C@_1EI@MLPKHBGE@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAr?$AAe?$AAg?$AAi?$AAs?$AAt?$AAr?$AAy?$AA?9?$AAl?$AA1?$AA?9?$AA1?$AA?9?$AA0?$AA?4@ 000000018006daa0 MSVCRTD:_pdblkup_.obj + 0003:0000eaf8 ??_C@_1BK@JHLNAEJL@?$AAa?$AAd?$AAv?$AAa?$AAp?$AAi?$AA3?$AA2?$AA?4?$AAd?$AAl?$AAl?$AA?$AA@ 000000018006daf8 MSVCRTD:_pdblkup_.obj + 0003:0000eb18 ??_C@_0O@COHOBMLB@RegOpenKeyExW?$AA@ 000000018006db18 MSVCRTD:_pdblkup_.obj + 0003:0000eb28 ??_C@_0BB@GLNAEDBD@RegQueryValueExW?$AA@ 000000018006db28 MSVCRTD:_pdblkup_.obj + 0003:0000eb40 ??_C@_0M@HLOHPNFA@RegCloseKey?$AA@ 000000018006db40 MSVCRTD:_pdblkup_.obj + 0003:0000eb50 ??_C@_1HE@EBEAGLFB@?$AAS?$AAO?$AAF?$AAT?$AAW?$AAA?$AAR?$AAE?$AA?2?$AAW?$AAo?$AAw?$AA6?$AA4?$AA3?$AA2?$AAN?$AAo?$AAd?$AAe?$AA?2?$AAM?$AAi?$AAc?$AAr?$AAo?$AAs?$AAo?$AAf?$AAt?$AA?2?$AAV@ 000000018006db50 MSVCRTD:_pdblkup_.obj + 0003:0000ebe0 ??_C@_1BG@EABPBLLF@?$AAP?$AAr?$AAo?$AAd?$AAu?$AAc?$AAt?$AAD?$AAi?$AAr?$AA?$AA@ 000000018006dbe0 MSVCRTD:_pdblkup_.obj + 0003:0000ec28 ??_C@_1BC@JINFINNJ@?$AAM?$AAS?$AAP?$AAD?$AAB?$AA1?$AA4?$AA0?$AA?$AA@ 000000018006dc28 MSVCRTD:_pdblkup_.obj + 0003:0000ec40 ??_C@_0BB@KCIACLNC@PDBOpenValidate5?$AA@ 000000018006dc40 MSVCRTD:_pdblkup_.obj + 0003:0000eca0 _load_config_used 000000018006dca0 MSVCRTD:loadcfg.obj + 0003:0000f308 __rtc_iaa 000000018006e308 MSVCRTD:_initsect_.obj + 0003:0000f720 __rtc_izz 000000018006e720 MSVCRTD:_initsect_.obj + 0003:0000f830 __rtc_taa 000000018006e830 MSVCRTD:_initsect_.obj + 0003:0000fc48 __rtc_tzz 000000018006ec48 MSVCRTD:_initsect_.obj + 0004:000004cc VendorID 00000001800724cc hid-windows.obj + 0004:000004d0 ProductID 00000001800724d0 hid-windows.obj + 0004:000004d8 LinmathQuat_Identity 00000001800724d8 linmath.obj + 0004:000004f8 LinmathPose_Identity 00000001800724f8 linmath.obj + 0004:00000548 LighthouseQuat 0000000180072548 poser_octavioradii.obj + 0004:00000590 ?__LINE__Var@?0??resize_config_group@@9@9 0000000180072590 survive_config.obj + 0004:00000594 ?__LINE__Var@?0??sstrcpy@@9@9 0000000180072594 survive_config.obj + 0004:00000598 ?__LINE__Var@?0??config_set_float_a@@9@9 0000000180072598 survive_config.obj + 0004:0000059c SurviveSensorActivations_default_tolerance 000000018007259c survive_sensor_activations.obj + 0004:000005a0 devnames 00000001800725a0 survive_vive.obj + 0004:00000750 __security_cookie 0000000180072750 MSVCRTD:gs_cookie.obj + 0004:00000758 __security_cookie_complement 0000000180072758 MSVCRTD:gs_cookie.obj + 0004:00000770 _fltused 0000000180072770 MSVCRTD:fltused.obj + 0004:00000778 ?_RTC_ErrorLevels@@3PAHA 0000000180072778 MSVCRTD:_error_.obj + 0004:00000790 __scrt_native_dllmain_reason 0000000180072790 MSVCRTD:utility.obj + 0004:00000798 __isa_available 0000000180072798 MSVCRTD:_cpu_disp_.obj + 0004:0000079c __isa_enabled 000000018007279c MSVCRTD:_cpu_disp_.obj + 0004:000007a0 __memcpy_nt_iters 00000001800727a0 MSVCRTD:_cpu_disp_.obj + 0004:000007b0 __scrt_ucrt_dll_is_in_use 00000001800727b0 MSVCRTD:ucrt_stubs.obj + 0004:00000960 json_begin_object 0000000180072960 json_helpers.obj + 0004:00000968 json_end_object 0000000180072968 json_helpers.obj + 0004:00000970 json_tag_value 0000000180072970 json_helpers.obj + 0004:00000d18 ootx_packet_clbk 0000000180072d18 ootx_decoder.obj + 0004:00000d20 ootx_bad_crc_clbk 0000000180072d20 ootx_decoder.obj + 0004:00000d30 best_hmd_target 0000000180072d30 poser_octavioradii.obj + 0004:00000d38 LighthousePos 0000000180072d38 poser_octavioradii.obj + 0004:00000d61 cg_stack_head 0000000180072d61 survive_config.obj + 0004:000017e8 ?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA 00000001800737e8 MSVCRTD:_error_.obj + 0004:00001800 ?__type_info_root_node@@3U__type_info_node@@A 0000000180073800 MSVCRTD:tncleanup.obj + 0004:00001818 ?_OptionsStorage@?1??__local_stdio_scanf_options@@9@4_KA 0000000180073818 MSVCRTD:default_local_stdio_options.obj + 0004:00001828 __scrt_current_native_startup_state 0000000180073828 MSVCRTD:utility.obj + 0004:00001830 __scrt_native_startup_lock 0000000180073830 MSVCRTD:utility.obj + 0004:00001878 __scrt_debugger_hook_flag 0000000180073878 MSVCRTD:utility_desktop.obj + 0004:0000188c __favor 000000018007388c MSVCRTD:_cpu_disp_.obj + 0004:00001890 so 0000000180073890 + 0004:000018a6 axis2Val 00000001800738a6 + 0004:000018a8 axis2Id 00000001800738a8 + 0004:000018aa axis1Val 00000001800738aa + 0004:000018ac axis1Id 00000001800738ac + 0004:000018ad buttonId 00000001800738ad + 0004:000018ae eventType 00000001800738ae + 0004:000018af isPopulated 00000001800738af + 0004:000018b0 GlobalRXUSBMutx 00000001800738b0 + 0004:000018b8 ?_OptionsStorage@?1??__local_stdio_scanf_options@@9@9 00000001800738b8 + 0004:000018e0 cg_stack 00000001800738e0 + 0004:00001950 survive_context 0000000180073950 + 0004:00001960 hmd_point_counts 0000000180073960 + 0004:00001c40 hmd_point_angles 0000000180073c40 + 0004:00001e40 hmd_norms 0000000180073e40 + 0004:00002140 hmd_points 0000000180074140 + 0004:00002440 ?_OptionsStorage@?1??__local_stdio_printf_options@@9@9 0000000180074440 + 0004:00002454 JSON_STRING_LEN 0000000180074454 + 0004:00002458 __dyn_tls_init_callback 0000000180074458 + 0006:00000000 __imp_VirtualQuery 0000000180079000 kernel32:KERNEL32.dll + 0006:00000008 __imp_RtlLookupFunctionEntry 0000000180079008 kernel32:KERNEL32.dll + 0006:00000010 __imp_RtlVirtualUnwind 0000000180079010 kernel32:KERNEL32.dll + 0006:00000018 __imp_GetProcessHeap 0000000180079018 kernel32:KERNEL32.dll + 0006:00000020 __imp_UnhandledExceptionFilter 0000000180079020 kernel32:KERNEL32.dll + 0006:00000028 __imp_SetUnhandledExceptionFilter 0000000180079028 kernel32:KERNEL32.dll + 0006:00000030 __imp_TerminateProcess 0000000180079030 kernel32:KERNEL32.dll + 0006:00000038 __imp_IsProcessorFeaturePresent 0000000180079038 kernel32:KERNEL32.dll + 0006:00000040 __imp_IsDebuggerPresent 0000000180079040 kernel32:KERNEL32.dll + 0006:00000048 __imp_RaiseException 0000000180079048 kernel32:KERNEL32.dll + 0006:00000050 __imp_MultiByteToWideChar 0000000180079050 kernel32:KERNEL32.dll + 0006:00000058 __imp_CreateFileA 0000000180079058 kernel32:KERNEL32.dll + 0006:00000060 __imp_ReadFile 0000000180079060 kernel32:KERNEL32.dll + 0006:00000068 __imp_WriteFile 0000000180079068 kernel32:KERNEL32.dll + 0006:00000070 __imp_CloseHandle 0000000180079070 kernel32:KERNEL32.dll + 0006:00000078 __imp_GetLastError 0000000180079078 kernel32:KERNEL32.dll + 0006:00000080 __imp_DeviceIoControl 0000000180079080 kernel32:KERNEL32.dll + 0006:00000088 __imp_GetOverlappedResult 0000000180079088 kernel32:KERNEL32.dll + 0006:00000090 __imp_CancelIo 0000000180079090 kernel32:KERNEL32.dll + 0006:00000098 __imp_ResetEvent 0000000180079098 kernel32:KERNEL32.dll + 0006:000000a0 __imp_WaitForSingleObject 00000001800790a0 kernel32:KERNEL32.dll + 0006:000000a8 __imp_CreateEventA 00000001800790a8 kernel32:KERNEL32.dll + 0006:000000b0 __imp_FreeLibrary 00000001800790b0 kernel32:KERNEL32.dll + 0006:000000b8 __imp_GetProcAddress 00000001800790b8 kernel32:KERNEL32.dll + 0006:000000c0 __imp_LoadLibraryA 00000001800790c0 kernel32:KERNEL32.dll + 0006:000000c8 __imp_LocalFree 00000001800790c8 kernel32:KERNEL32.dll + 0006:000000d0 __imp_FormatMessageW 00000001800790d0 kernel32:KERNEL32.dll + 0006:000000d8 __imp_GetFileTime 00000001800790d8 kernel32:KERNEL32.dll + 0006:000000e0 __imp_QueryPerformanceCounter 00000001800790e0 kernel32:KERNEL32.dll + 0006:000000e8 __imp_QueryPerformanceFrequency 00000001800790e8 kernel32:KERNEL32.dll + 0006:000000f0 __imp_ReleaseSemaphore 00000001800790f0 kernel32:KERNEL32.dll + 0006:000000f8 __imp_ReleaseMutex 00000001800790f8 kernel32:KERNEL32.dll + 0006:00000100 __imp_CreateMutexA 0000000180079100 kernel32:KERNEL32.dll + 0006:00000108 __imp_Sleep 0000000180079108 kernel32:KERNEL32.dll + 0006:00000110 __imp_CreateThread 0000000180079110 kernel32:KERNEL32.dll + 0006:00000118 __imp_GetModuleHandleA 0000000180079118 kernel32:KERNEL32.dll + 0006:00000120 __imp_CreateSemaphoreA 0000000180079120 kernel32:KERNEL32.dll + 0006:00000128 __imp_GetCurrentProcess 0000000180079128 kernel32:KERNEL32.dll + 0006:00000130 __imp_CreateDirectoryA 0000000180079130 kernel32:KERNEL32.dll + 0006:00000138 __imp_WideCharToMultiByte 0000000180079138 kernel32:KERNEL32.dll + 0006:00000140 __imp_GetCurrentProcessId 0000000180079140 kernel32:KERNEL32.dll + 0006:00000148 __imp_GetCurrentThreadId 0000000180079148 kernel32:KERNEL32.dll + 0006:00000150 __imp_GetSystemTimeAsFileTime 0000000180079150 kernel32:KERNEL32.dll + 0006:00000158 __imp_DisableThreadLibraryCalls 0000000180079158 kernel32:KERNEL32.dll + 0006:00000160 __imp_InitializeSListHead 0000000180079160 kernel32:KERNEL32.dll + 0006:00000168 __imp_GetStartupInfoW 0000000180079168 kernel32:KERNEL32.dll + 0006:00000170 __imp_GetModuleHandleW 0000000180079170 kernel32:KERNEL32.dll + 0006:00000178 __imp_HeapAlloc 0000000180079178 kernel32:KERNEL32.dll + 0006:00000180 __imp_HeapFree 0000000180079180 kernel32:KERNEL32.dll + 0006:00000188 __imp_RtlCaptureContext 0000000180079188 kernel32:KERNEL32.dll + 0006:00000190 \177KERNEL32_NULL_THUNK_DATA 0000000180079190 kernel32:KERNEL32.dll + 0006:00000238 __imp_SetupDiDestroyDeviceInfoList 0000000180079238 SetupAPI:SETUPAPI.dll + 0006:00000240 __imp_SetupDiEnumDeviceInterfaces 0000000180079240 SetupAPI:SETUPAPI.dll + 0006:00000248 __imp_SetupDiGetDeviceInterfaceDetailA 0000000180079248 SetupAPI:SETUPAPI.dll + 0006:00000250 __imp_SetupDiGetClassDevsA 0000000180079250 SetupAPI:SETUPAPI.dll + 0006:00000258 __imp_SetupDiGetDeviceRegistryPropertyA 0000000180079258 SetupAPI:SETUPAPI.dll + 0006:00000260 __imp_SetupDiEnumDeviceInfo 0000000180079260 SetupAPI:SETUPAPI.dll + 0006:00000268 \177SETUPAPI_NULL_THUNK_DATA 0000000180079268 SetupAPI:SETUPAPI.dll + 0006:000002c8 __imp_strstr 00000001800792c8 vcruntimed:VCRUNTIME140D.dll + 0006:000002d0 __imp_memset 00000001800792d0 vcruntimed:VCRUNTIME140D.dll + 0006:000002d8 __imp_longjmp 00000001800792d8 vcruntimed:VCRUNTIME140D.dll + 0006:000002e0 __imp___vcrt_LoadLibraryExW 00000001800792e0 vcruntimed:VCRUNTIME140D.dll + 0006:000002e8 __imp___vcrt_GetModuleHandleW 00000001800792e8 vcruntimed:VCRUNTIME140D.dll + 0006:000002f0 __imp_memcmp 00000001800792f0 vcruntimed:VCRUNTIME140D.dll + 0006:000002f8 __imp___intrinsic_setjmp 00000001800792f8 vcruntimed:VCRUNTIME140D.dll + 0006:00000300 __imp___C_specific_handler 0000000180079300 vcruntimed:VCRUNTIME140D.dll + 0006:00000308 __imp___std_type_info_destroy_list 0000000180079308 vcruntimed:VCRUNTIME140D.dll + 0006:00000310 __imp___vcrt_GetModuleFileNameW 0000000180079310 vcruntimed:VCRUNTIME140D.dll + 0006:00000318 __imp_memcpy 0000000180079318 vcruntimed:VCRUNTIME140D.dll + 0006:00000320 \177VCRUNTIME140D_NULL_THUNK_DATA 0000000180079320 vcruntimed:VCRUNTIME140D.dll + 0006:00000388 __imp_SymEnumSymbols 0000000180079388 DbgHelp:dbghelp.dll + 0006:00000390 __imp_SymInitialize 0000000180079390 DbgHelp:dbghelp.dll + 0006:00000398 __imp_SymCleanup 0000000180079398 DbgHelp:dbghelp.dll + 0006:000003a0 \177dbghelp_NULL_THUNK_DATA 00000001800793a0 DbgHelp:dbghelp.dll + 0006:000003f8 __imp_fabs 00000001800793f8 ucrtd:ucrtbased.dll + 0006:00000400 __imp_sin 0000000180079400 ucrtd:ucrtbased.dll + 0006:00000408 __imp_sqrt 0000000180079408 ucrtd:ucrtbased.dll + 0006:00000410 __imp___acrt_iob_func 0000000180079410 ucrtd:ucrtbased.dll + 0006:00000418 __imp_tan 0000000180079418 ucrtd:ucrtbased.dll + 0006:00000420 __imp__dclass 0000000180079420 ucrtd:ucrtbased.dll + 0006:00000428 __imp_qsort 0000000180079428 ucrtd:ucrtbased.dll + 0006:00000430 __imp_atan 0000000180079430 ucrtd:ucrtbased.dll + 0006:00000438 __imp_realloc 0000000180079438 ucrtd:ucrtbased.dll + 0006:00000440 __imp_exit 0000000180079440 ucrtd:ucrtbased.dll + 0006:00000448 __imp_strncmp 0000000180079448 ucrtd:ucrtbased.dll + 0006:00000450 __imp_atof 0000000180079450 ucrtd:ucrtbased.dll + 0006:00000458 __imp_atoi 0000000180079458 ucrtd:ucrtbased.dll + 0006:00000460 __imp__wassert 0000000180079460 ucrtd:ucrtbased.dll + 0006:00000468 __imp_strcpy 0000000180079468 ucrtd:ucrtbased.dll + 0006:00000470 __imp_roundf 0000000180079470 ucrtd:ucrtbased.dll + 0006:00000478 __imp_feof 0000000180079478 ucrtd:ucrtbased.dll + 0006:00000480 __imp_ferror 0000000180079480 ucrtd:ucrtbased.dll + 0006:00000488 __imp___stdio_common_vsscanf 0000000180079488 ucrtd:ucrtbased.dll + 0006:00000490 __imp_abs 0000000180079490 ucrtd:ucrtbased.dll + 0006:00000498 __imp_sqrtf 0000000180079498 ucrtd:ucrtbased.dll + 0006:000004a0 __imp__errno 00000001800794a0 ucrtd:ucrtbased.dll + 0006:000004a8 __imp___stdio_common_vfwprintf 00000001800794a8 ucrtd:ucrtbased.dll + 0006:000004b0 __imp_fwrite 00000001800794b0 ucrtd:ucrtbased.dll + 0006:000004b8 __imp_getc 00000001800794b8 ucrtd:ucrtbased.dll + 0006:000004c0 __imp__CrtDbgReport 00000001800794c0 ucrtd:ucrtbased.dll + 0006:000004c8 __imp__CrtDbgReportW 00000001800794c8 ucrtd:ucrtbased.dll + 0006:000004d0 __imp__initterm 00000001800794d0 ucrtd:ucrtbased.dll + 0006:000004d8 __imp__initterm_e 00000001800794d8 ucrtd:ucrtbased.dll + 0006:000004e0 __imp_strcpy_s 00000001800794e0 ucrtd:ucrtbased.dll + 0006:000004e8 __imp_strcat_s 00000001800794e8 ucrtd:ucrtbased.dll + 0006:000004f0 __imp___stdio_common_vsprintf_s 00000001800794f0 ucrtd:ucrtbased.dll + 0006:000004f8 __imp__seh_filter_dll 00000001800794f8 ucrtd:ucrtbased.dll + 0006:00000500 __imp__configure_narrow_argv 0000000180079500 ucrtd:ucrtbased.dll + 0006:00000508 __imp__initialize_narrow_environment 0000000180079508 ucrtd:ucrtbased.dll + 0006:00000510 __imp__initialize_onexit_table 0000000180079510 ucrtd:ucrtbased.dll + 0006:00000518 __imp__register_onexit_function 0000000180079518 ucrtd:ucrtbased.dll + 0006:00000520 __imp__execute_onexit_table 0000000180079520 ucrtd:ucrtbased.dll + 0006:00000528 __imp__crt_atexit 0000000180079528 ucrtd:ucrtbased.dll + 0006:00000530 __imp__crt_at_quick_exit 0000000180079530 ucrtd:ucrtbased.dll + 0006:00000538 __imp__cexit 0000000180079538 ucrtd:ucrtbased.dll + 0006:00000540 __imp_terminate 0000000180079540 ucrtd:ucrtbased.dll + 0006:00000548 __imp__wmakepath_s 0000000180079548 ucrtd:ucrtbased.dll + 0006:00000550 __imp__wsplitpath_s 0000000180079550 ucrtd:ucrtbased.dll + 0006:00000558 __imp_wcscpy_s 0000000180079558 ucrtd:ucrtbased.dll + 0006:00000560 __imp__mkdir 0000000180079560 ucrtd:ucrtbased.dll + 0006:00000568 __imp_cos 0000000180079568 ucrtd:ucrtbased.dll + 0006:00000570 __imp_atan2 0000000180079570 ucrtd:ucrtbased.dll + 0006:00000578 __imp_acos 0000000180079578 ucrtd:ucrtbased.dll + 0006:00000580 __imp_strtod 0000000180079580 ucrtd:ucrtbased.dll + 0006:00000588 __imp___stdio_common_vsprintf 0000000180079588 ucrtd:ucrtbased.dll + 0006:00000590 __imp___stdio_common_vfprintf 0000000180079590 ucrtd:ucrtbased.dll + 0006:00000598 __imp_ftell 0000000180079598 ucrtd:ucrtbased.dll + 0006:000005a0 __imp_fseek 00000001800795a0 ucrtd:ucrtbased.dll + 0006:000005a8 __imp_fread 00000001800795a8 ucrtd:ucrtbased.dll + 0006:000005b0 __imp_fputs 00000001800795b0 ucrtd:ucrtbased.dll + 0006:000005b8 __imp_fopen 00000001800795b8 ucrtd:ucrtbased.dll + 0006:000005c0 __imp_fclose 00000001800795c0 ucrtd:ucrtbased.dll + 0006:000005c8 __imp_strtol 00000001800795c8 ucrtd:ucrtbased.dll + 0006:000005d0 __imp_malloc 00000001800795d0 ucrtd:ucrtbased.dll + 0006:000005d8 __imp_free 00000001800795d8 ucrtd:ucrtbased.dll + 0006:000005e0 __imp_calloc 00000001800795e0 ucrtd:ucrtbased.dll + 0006:000005e8 __imp_strncpy 00000001800795e8 ucrtd:ucrtbased.dll + 0006:000005f0 __imp_strlen 00000001800795f0 ucrtd:ucrtbased.dll + 0006:000005f8 __imp_strcmp 00000001800795f8 ucrtd:ucrtbased.dll + 0006:00000600 __imp_wcscmp 0000000180079600 ucrtd:ucrtbased.dll + 0006:00000608 __imp__wcsdup 0000000180079608 ucrtd:ucrtbased.dll + 0006:00000610 __imp_asin 0000000180079610 ucrtd:ucrtbased.dll + 0006:00000618 \177ucrtbased_NULL_THUNK_DATA 0000000180079618 ucrtd:ucrtbased.dll + 0006:000006d8 __IMPORT_DESCRIPTOR_dbghelp 00000001800796d8 DbgHelp:dbghelp.dll + 0006:000006ec __IMPORT_DESCRIPTOR_SETUPAPI 00000001800796ec SetupAPI:SETUPAPI.dll + 0006:00000700 __IMPORT_DESCRIPTOR_KERNEL32 0000000180079700 kernel32:KERNEL32.dll + 0006:00000714 __IMPORT_DESCRIPTOR_VCRUNTIME140D 0000000180079714 vcruntimed:VCRUNTIME140D.dll + 0006:00000728 __IMPORT_DESCRIPTOR_ucrtbased 0000000180079728 ucrtd:ucrtbased.dll + 0006:0000073c __NULL_IMPORT_DESCRIPTOR 000000018007973c DbgHelp:dbghelp.dll + 0007:00000000 __guard_check_icall_fptr 000000018007b000 MSVCRTD:guard_support.obj + 0007:00000010 __guard_dispatch_icall_fptr 000000018007b010 MSVCRTD:guard_support.obj + 0007:00000020 __guard_ss_verify_failure_fptr 000000018007b020 MSVCRTD:guard_support.obj + 0007:00000030 __guard_ss_verify_sp_fptr 000000018007b030 MSVCRTD:guard_support.obj + + entry point at 0002:00000a0f + + Static symbols + + 0003:fffa1000 printf$rtcName$0 0000000180000000 survive_cal.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 survive_turveybiguator.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 poser_daveortho.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 poser_daveortho.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 poser_daveortho.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 poser_daveortho.obj + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 poser_daveortho.obj + 0005:fff8b000 $pdata$_vsprintf_l 0000000180000000 survive_cal.obj + 0003:fffa1000 $unwind$fprintf 0000000180000000 survive_turveybiguator.obj + 0003:fffa1000 $unwind$fprintf 0000000180000000 poser_daveortho.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 poser_daveortho.obj + 0003:fffa1000 printf$rtcName$0 0000000180000000 poser_daveortho.obj + 0003:fffa1000 sprintf$rtcName$0 0000000180000000 survive_cal.obj + 0005:fff8b000 $pdata$_vsnprintf_l 0000000180000000 survive_cal.obj + 0003:fffa1000 $unwind$printf 0000000180000000 poser_daveortho.obj + 0005:fff8b000 $pdata$printf 0000000180000000 poser_daveortho.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_vive.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_vive.obj + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 survive_turveybiguator.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive_turveybiguator.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive_turveybiguator.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_turveybiguator.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_turveybiguator.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive_vive.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive_vive.obj + 0003:fffa1000 printf$rtcName$0 0000000180000000 survive_vive.obj + 0003:fffa1000 $unwind$_vsnprintf_l 0000000180000000 survive_cal.obj + 0003:fffa1000 $unwind$printf 0000000180000000 survive_vive.obj + 0005:fff8b000 $pdata$printf 0000000180000000 survive_vive.obj + 0003:fffa1000 $unwind$_vsnprintf_l 0000000180000000 survive_vive.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 poser_octavioradii.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 poser_octavioradii.obj + 0000:fff82000 .debug$S 0000000180000000 libsurvive.exp + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 poser_octavioradii.obj + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 poser_octavioradii.obj + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0000:fff82000 .debug$S 0000000180000000 ucrtd:ucrtbased.dll + 0003:fffa1000 printf$rtcName$0 0000000180000000 poser_octavioradii.obj + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0000:fff82000 .debug$S 0000000180000000 vcruntimed:VCRUNTIME140D.dll + 0005:fff8b000 $pdata$_vsnprintf_l 0000000180000000 survive_vive.obj + 0005:fff8b000 $pdata$printf 0000000180000000 survive_cal.obj + 0003:fffa1000 $unwind$_vsprintf_l 0000000180000000 survive_vive.obj + 0005:fff8b000 $pdata$_vsprintf_l 0000000180000000 survive_vive.obj + 0003:fffa1000 $unwind$printf 0000000180000000 poser_octavioradii.obj + 0005:fff8b000 $pdata$printf 0000000180000000 poser_octavioradii.obj + 0003:fffa1000 sprintf$rtcName$0 0000000180000000 survive_vive.obj + 0003:fffa1000 $unwind$printf 0000000180000000 survive_cal.obj + 0000:fff85000 __guard_fids__guard_icall_checks_enforced 0000000180000000 MSVCRTD:guard_support.obj + 0003:fffa1000 $unwind$sprintf 0000000180000000 survive_vive.obj + 0005:fff8b000 $pdata$sprintf 0000000180000000 survive_vive.obj + 0005:fff8b000 $pdata$sprintf 0000000180000000 survive_playback.obj + 0003:fffa1000 $unwind$sprintf 0000000180000000 survive_playback.obj + 0000:fff85000 __guard_fids__ 0000000180000000 MSVCRTD:guard_support.obj + 0003:fffa1000 $unwind$sprintf 0000000180000000 survive_cal.obj + 0003:fffa1000 sprintf$rtcName$0 0000000180000000 survive_playback.obj + 0005:fff8b000 $pdata$_vsprintf_l 0000000180000000 survive_playback.obj + 0003:fffa1000 $unwind$_vsprintf_l 0000000180000000 survive_playback.obj + 0005:fff8b000 $pdata$_vsnprintf_l 0000000180000000 survive_playback.obj + 0003:fffa1000 $unwind$_vsnprintf_l 0000000180000000 survive_playback.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 survive_playback.obj + 0003:fffa1000 $unwind$fprintf 0000000180000000 survive_playback.obj + 0005:fff8b000 $pdata$sprintf 0000000180000000 survive_cal.obj + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 survive_playback.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive_playback.obj + 0005:fff8b000 $pdata$_vsnprintf_l 0000000180000000 poser_charlesslow.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive_playback.obj + 0003:fffa1000 $unwind$_vsnprintf_l 0000000180000000 poser_charlesslow.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_playback.obj + 0005:fff8b000 $pdata$printf 0000000180000000 poser_charlesslow.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_playback.obj + 0003:fffa1000 $unwind$printf 0000000180000000 poser_charlesslow.obj + 0005:fff8b000 $pdata$printf 0000000180000000 survive_driverman.obj + 0003:fffa1000 $unwind$printf 0000000180000000 survive_driverman.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 survive_cal.obj + 0003:fffa1000 printf$rtcName$0 0000000180000000 survive_driverman.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive_driverman.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive_driverman.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_driverman.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_driverman.obj + 0005:fff8b000 $pdata$sprintf 0000000180000000 survive_default_devices.obj + 0003:fffa1000 $unwind$sprintf 0000000180000000 survive_default_devices.obj + 0003:fffa1000 $unwind$fprintf 0000000180000000 survive_cal.obj + 0003:fffa1000 sprintf$rtcName$0 0000000180000000 survive_default_devices.obj + 0005:fff8b000 $pdata$_vsprintf_l 0000000180000000 survive_default_devices.obj + 0003:fffa1000 $unwind$_vsprintf_l 0000000180000000 survive_default_devices.obj + 0005:fff8b000 $pdata$_vsnprintf_l 0000000180000000 survive_default_devices.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 poser_turveytori.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 poser_turveytori.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 poser_turveytori.obj + 0003:fffa1000 $unwind$_vsnprintf_l 0000000180000000 survive_default_devices.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 survive_default_devices.obj + 0003:fffa1000 $unwind$fprintf 0000000180000000 survive_default_devices.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 poser_turveytori.obj + 0003:fffa1000 printf$rtcName$0 0000000180000000 poser_turveytori.obj + 0000:fff85000 __guard_fids_?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180000000 MSVCRTD:dll_dllmain.obj + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 survive_cal.obj + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 survive_default_devices.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive_default_devices.obj + 0003:fffa1000 $unwind$printf 0000000180000000 poser_turveytori.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive_default_devices.obj + 0005:fff8b000 $pdata$printf 0000000180000000 poser_turveytori.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_default_devices.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive_cal.obj + 0003:fffa1000 printf$rtcName$0 0000000180000000 poser_charlesslow.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 poser_charlesslow.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_default_devices.obj + 0003:fffa1000 $unwind$fprintf 0000000180000000 poser_charlesslow.obj + 0000:fff82000 .debug$S 0000000180000000 DbgHelp:dbghelp.dll + 0000:fff82000 .debug$S 0000000180000000 DbgHelp:dbghelp.dll + 0000:fff82000 .debug$S 0000000180000000 DbgHelp:dbghelp.dll + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive_cal.obj + 0000:fff82000 .debug$S 0000000180000000 SetupAPI:SETUPAPI.dll + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 poser_charlesslow.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 poser_charlesslow.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 poser_charlesslow.obj + 0000:fff85000 __guard_fids___scrt_set_unhandled_exception_filter 0000000180000000 MSVCRTD:utility_desktop.obj + 0000:fff82000 .debug$S 0000000180000000 SetupAPI:SETUPAPI.dll + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 poser_charlesslow.obj + 0000:fff82000 .debug$S 0000000180000000 SetupAPI:SETUPAPI.dll + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 poser_charlesslow.obj + 0000:fff82000 .debug$S 0000000180000000 SetupAPI:SETUPAPI.dll + 0000:fff82000 .debug$S 0000000180000000 SetupAPI:SETUPAPI.dll + 0000:fff82000 .debug$S 0000000180000000 SetupAPI:SETUPAPI.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive.obj + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 survive.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_cal.obj + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0003:fffa1000 $unwind$fprintf 0000000180000000 survive.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 survive.obj + 0003:fffa1000 printf$rtcName$0 0000000180000000 survive.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_cal.obj + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0003:fffa1000 $unwind$printf 0000000180000000 survive.obj + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0005:fff8b000 $pdata$printf 0000000180000000 survive.obj + 0003:fffa1000 $unwind$_vsnprintf_l 0000000180000000 survive.obj + 0005:fff8b000 $pdata$_vsnprintf_l 0000000180000000 survive.obj + 0003:fffa1000 $unwind$_vsprintf_l 0000000180000000 survive.obj + 0005:fff8b000 $pdata$_vsprintf_l 0000000180000000 survive.obj + 0003:fffa1000 sprintf$rtcName$0 0000000180000000 survive.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_charlesbiguator.obj + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff82000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff85000 __guard_fids__CRT_RTC_INIT 0000000180000000 MSVCRTD:_init_.obj + 0000:fff85000 __guard_fids__CRT_RTC_INITW 0000000180000000 MSVCRTD:_init_.obj + 0003:fffa1000 $unwind$sprintf 0000000180000000 survive.obj + 0005:fff8b000 $pdata$printf 0000000180000000 survive_config.obj + 0003:fffa1000 $unwind$printf 0000000180000000 survive_config.obj + 0005:fff8b000 $pdata$sprintf 0000000180000000 survive.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_charlesbiguator.obj + 0003:fffa1000 printf$rtcName$0 0000000180000000 survive_config.obj + 0005:fff8b000 $pdata$fprintf 0000000180000000 survive_config.obj + 0003:fffa1000 $unwind$fprintf 0000000180000000 survive_config.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 ootx_decoder.obj + 0003:fffa1000 fprintf$rtcName$0 0000000180000000 survive_config.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 survive_config.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 survive_config.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 survive_config.obj + 0003:fffa1000 $unwind$__local_stdio_printf_options 0000000180000000 survive_config.obj + 0005:fff8b000 $pdata$sprintf 0000000180000000 survive_charlesbiguator.obj + 0003:fffa1000 $unwind$sprintf 0000000180000000 survive_charlesbiguator.obj + 0005:fff8b000 $pdata$__local_stdio_printf_options 0000000180000000 ootx_decoder.obj + 0003:fffa1000 sprintf$rtcName$0 0000000180000000 survive_charlesbiguator.obj + 0005:fff8b000 $pdata$_vsprintf_l 0000000180000000 survive_charlesbiguator.obj + 0003:fffa1000 $unwind$_vsprintf_l 0000000180000000 survive_charlesbiguator.obj + 0005:fff8b000 $pdata$_vsnprintf_l 0000000180000000 survive_charlesbiguator.obj + 0003:fffa1000 $unwind$_vsnprintf_l 0000000180000000 survive_charlesbiguator.obj + 0005:fff8b000 $pdata$_vfprintf_l 0000000180000000 ootx_decoder.obj + 0003:fffa1000 $unwind$_vfprintf_l 0000000180000000 ootx_decoder.obj + 0003:fffa1000 $unwind$_vsprintf_l 0000000180000000 survive_cal.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 survive_config.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 survive_config.obj + 0003:fffa1010 sprintf$rtcVarDesc 0000000180000010 survive.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 survive.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 survive.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 poser_charlesslow.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 poser_charlesslow.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 survive_default_devices.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 survive_cal.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 poser_turveytori.obj + 0003:fffa1010 sprintf$rtcVarDesc 0000000180000010 survive_default_devices.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 survive_driverman.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 survive_playback.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 survive_cal.obj + 0003:fffa1010 sprintf$rtcVarDesc 0000000180000010 survive_playback.obj + 0003:fffa1010 sprintf$rtcVarDesc 0000000180000010 survive_cal.obj + 0003:fffa1010 sprintf$rtcVarDesc 0000000180000010 survive_vive.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 poser_octavioradii.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 survive_vive.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 survive_turveybiguator.obj + 0003:fffa1010 printf$rtcVarDesc 0000000180000010 poser_daveortho.obj + 0003:fffa1010 fprintf$rtcVarDesc 0000000180000010 poser_daveortho.obj + 0003:fffa1010 sprintf$rtcVarDesc 0000000180000010 survive_charlesbiguator.obj + 0003:fffa1050 sprintf$rtcFrameData 0000000180000050 survive_vive.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 survive_config.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 poser_charlesslow.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 survive_driverman.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 survive_vive.obj + 0003:fffa1050 sprintf$rtcFrameData 0000000180000050 survive.obj + 0003:fffa1050 sprintf$rtcFrameData 0000000180000050 survive_charlesbiguator.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 survive_cal.obj + 0003:fffa1050 sprintf$rtcFrameData 0000000180000050 survive_cal.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 survive.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 survive.obj + 0003:fffa1050 sprintf$rtcFrameData 0000000180000050 survive_default_devices.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 poser_octavioradii.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 survive_config.obj + 0003:fffa1050 sprintf$rtcFrameData 0000000180000050 survive_playback.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 poser_daveortho.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 survive_turveybiguator.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 poser_charlesslow.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 survive_default_devices.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 survive_cal.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 poser_turveytori.obj + 0003:fffa1050 printf$rtcFrameData 0000000180000050 poser_daveortho.obj + 0003:fffa1050 fprintf$rtcFrameData 0000000180000050 survive_playback.obj + 0002:000015d0 free_hid_device 00000001800205d0 f hid-windows.obj + 0002:00003200 lookup_functions 0000000180022200 f hid-windows.obj + 0002:000034f0 new_hid_device 00000001800224f0 f hid-windows.obj + 0002:000035f0 open_device 00000001800225f0 f hid-windows.obj + 0002:000036c0 register_error 00000001800226c0 f hid-windows.obj + 0002:000037d0 jsmn_alloc_token 00000001800227d0 f jsmn.obj + 0002:000038b0 jsmn_fill_token 00000001800228b0 f jsmn.obj + 0002:00003f74 $LN50 0000000180022f74 jsmn.obj + 0002:00003f90 $LN49 0000000180022f90 jsmn.obj + 0002:000041a0 jsmn_parse_primitive 00000001800231a0 f jsmn.obj + 0002:00004368 $LN14 0000000180023368 jsmn.obj + 0002:00004370 $LN13 0000000180023370 jsmn.obj + 0002:00004480 jsmn_parse_string 0000000180023480 f jsmn.obj + 0002:000047b8 $LN23 00000001800237b8 jsmn.obj + 0002:000047c4 $LN22 00000001800237c4 jsmn.obj + 0002:00004e60 json_load_array 0000000180023e60 f json_helpers.obj + 0002:00005cd0 substr 0000000180024cd0 f json_helpers.obj + 0002:0000cc40 bits 000000018002bc40 f puff.obj + 0002:0000cde0 codes 000000018002bde0 f puff.obj + 0002:0000d100 construct 000000018002c100 f puff.obj + 0002:0000d410 decode 000000018002c410 f puff.obj + 0002:0000d6e0 dynamic 000000018002c6e0 f puff.obj + 0002:0000dc00 fixed 000000018002cc00 f puff.obj + 0002:0000e070 stored 000000018002d070 f puff.obj + 0002:000109c0 RunOpti 000000018002f9c0 f poser_charlesslow.obj + 0002:00018e30 QuickPose 0000000180037e30 f poser_octavioradii.obj + 0002:00019470 RefineEstimateUsingGradientDescentRadii 0000000180038470 f poser_octavioradii.obj + 0002:000199b0 SolveForLighthouseRadii 00000001800389b0 f poser_octavioradii.obj + 0002:00019d60 angleBetweenSensors 0000000180038d60 f poser_octavioradii.obj + 0002:00019e20 calculateFitness 0000000180038e20 f poser_octavioradii.obj + 0002:0001a280 distance 0000000180039280 f poser_octavioradii.obj + 0002:0001a370 getGradient 0000000180039370 f poser_octavioradii.obj + 0002:0001a500 normalizeAndMultiplyVector 0000000180039500 f poser_octavioradii.obj + 0002:0001bb60 QuickPose 000000018003ab60 f poser_turveytori.obj + 0002:0001c210 RefineEstimateUsingModifiedGradientDescent1 000000018003b210 f poser_turveytori.obj + 0002:0001c830 RefineRotationEstimateAxisAngle 000000018003b830 f poser_turveytori.obj + 0002:0001cc40 RefineRotationEstimateQuaternion 000000018003bc40 f poser_turveytori.obj + 0002:0001e3f0 SolveForLighthouse 000000018003d3f0 f poser_turveytori.obj + 0002:0001fd40 WhereIsTheTrackedObjectAxisAngle 000000018003ed40 f poser_turveytori.obj + 0002:00020700 distance 000000018003f700 f poser_turveytori.obj + 0002:00022b00 button_servicer 0000000180041b00 f survive.obj + 0002:00024c50 survivefault 0000000180043c50 f survive.obj + 0002:00024cd0 survivenote 0000000180043cd0 f survive.obj + 0002:00024d60 handle_calibration 0000000180043d60 f survive_cal.obj + 0002:00026b80 reset_calibration 0000000180045b80 f survive_cal.obj + 0002:00028a10 HandleOOTX 0000000180047a10 f survive_charlesbiguator.obj + 0002:00028d10 decode_acode 0000000180047d10 f survive_charlesbiguator.obj + 0002:00028e30 config_entry_as_FLT 0000000180047e30 f survive_config.obj + 0002:00028f10 config_entry_as_uint32_t 0000000180047f10 f survive_config.obj + 0002:0002ac50 sc_search 0000000180049c50 f survive_config.obj + 0002:0002b510 ParsePoints 000000018004a510 f survive_default_devices.obj + 0002:0002b800 jsoneq 000000018004a800 f survive_default_devices.obj + 0002:0002b8f0 survive_create_device 000000018004a8f0 f survive_default_devices.obj + 0002:0002d250 parse_and_run_imu 000000018004c250 f survive_playback.obj + 0002:0002d500 parse_and_run_lightcode 000000018004c500 f survive_playback.obj + 0002:0002d7d0 parse_and_run_rawlight 000000018004c7d0 f survive_playback.obj + 0002:0002d980 playback_close 000000018004c980 f survive_playback.obj + 0002:0002da10 playback_poll 000000018004ca10 f survive_playback.obj + 0002:0002e74c $LN11 000000018004d74c survive_playback.obj + 0002:0002ec10 timestamp_in_us 000000018004dc10 f survive_playback.obj + 0002:0002ed00 write_to_output 000000018004dd00 f survive_playback.obj + 0002:0002f9b0 gibf 000000018004e9b0 f survive_reproject.obj + 0002:0002ffa0 survive_calibration_options_config_normalize 000000018004efa0 f survive_reproject.obj + 0002:00030cc0 handle_lightcap2_getAcodeFromSyncPulse 000000018004fcc0 f survive_turveybiguator.obj + 0002:00030e60 handle_lightcap2_process_sweep_data 000000018004fe60 f survive_turveybiguator.obj + 0002:00031390 handle_lightcap2_sweep 0000000180050390 f survive_turveybiguator.obj + 0002:00031540 handle_lightcap2_sync 0000000180050540 f survive_turveybiguator.obj + 0002:000318d0 remove_outliers 00000001800508d0 f survive_turveybiguator.obj + 0002:00031cd0 AttachInterface 0000000180050cd0 f survive_vive.obj + 0002:000325c0 LoadConfig 00000001800515c0 f survive_vive.obj + 0002:00032d90 getupdate_feature_report 0000000180051d90 f survive_vive.obj + 0002:00032e20 handle_watchman 0000000180051e20 f survive_vive.obj + 0002:00033f40 hid_get_feature_report_timeout 0000000180052f40 f survive_vive.obj + 0002:00035138 $LN35 0000000180054138 survive_vive.obj + 0002:00037010 update_feature_report 0000000180056010 f survive_vive.obj + 0002:000379c0 capture_current_context 00000001800569c0 f MSVCRTD:gs_report.obj + 0002:00037a80 capture_previous_context 0000000180056a80 f MSVCRTD:gs_report.obj + 0002:00037f40 $$000000 0000000180056f40 MSVCRTD:_amdsecgs_.obj + 0002:00037f80 $$000000 0000000180056f80 MSVCRTD:_chkstk_.obj + 0002:00038000 ?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180057000 f MSVCRTD:dll_dllmain.obj + 0002:000380b0 ?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 00000001800570b0 f MSVCRTD:dll_dllmain.obj + 0002:00038230 ?dllmain_crt_process_detach@@YAH_N@Z 0000000180057230 f MSVCRTD:dll_dllmain.obj + 0002:000382e0 ?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 00000001800572e0 f MSVCRTD:dll_dllmain.obj + 0002:00038470 ?dllmain_raw@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180057470 f MSVCRTD:dll_dllmain.obj + 0002:00038640 ?DebuggerProbe@@YA_NK@Z 0000000180057640 f MSVCRTD:_error_.obj + 0002:00038690 ?DebuggerRuntime@@YA_NKHPEAXPEB_W@Z 0000000180057690 f MSVCRTD:_error_.obj + 0002:00038a20 ?_getMemBlockDataString@@YAXPEAD0PEBD_K@Z 0000000180057a20 f MSVCRTD:_error_.obj + 0002:00038b00 ?_strlen_priv@@YA_KPEBD@Z 0000000180057b00 f MSVCRTD:_error_.obj + 0002:00038b20 ?failwithmessage@@YAXPEAXHHPEBD@Z 0000000180057b20 f MSVCRTD:_error_.obj + 0002:00038e40 ?notify_debugger@@YAXAEBUtagEXCEPTION_VISUALCPP_DEBUG_INFO@@@Z 0000000180057e40 f MSVCRTD:_error_.obj + 0002:00039040 __get_entropy 0000000180058040 f MSVCRTD:gs_support.obj + 0002:000393a0 ?find_pe_section@@YAPEAU_IMAGE_SECTION_HEADER@@QEAE_K@Z 00000001800583a0 f MSVCRTD:utility.obj + 0002:000394c0 ?is_potentially_valid_image_base@@YA_NQEAX@Z 00000001800584c0 f MSVCRTD:utility.obj + 0002:0003a110 ?GetPdbDll@@YAPEAUHINSTANCE__@@XZ 0000000180059110 f MSVCRTD:_pdblkup_.obj + 0002:0003a2b0 ?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 00000001800592b0 f MSVCRTD:_pdblkup_.obj + 0002:0003a630 ?GetPdbDllPathFromFilePath@@YAHPEB_WPEA_W_K@Z 0000000180059630 f MSVCRTD:_pdblkup_.obj + 0002:0003cf90 $$000000 000000018005bf90 MSVCRTD:_guard_dispatch_.obj + 0002:0003cfb0 $$000000 000000018005bfb0 MSVCRTD:_rfgfailure_.obj + 0002:0003e0a0 ?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 000000018005d0a0 f MSVCRTD:dll_dllmain.obj + 0002:0003e0c0 ?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 000000018005d0c0 f MSVCRTD:dll_dllmain.obj + 0002:0003e0f0 ?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 000000018005d0f0 f MSVCRTD:dll_dllmain.obj + 0002:0003e150 ?filt$0@?0??notify_debugger@@YAXAEBUtagEXCEPTION_VISUALCPP_DEBUG_INFO@@@Z@4HA 000000018005d150 f MSVCRTD:_error_.obj + 0002:0003e180 __scrt_is_nonwritable_in_current_image$filt$0 000000018005d180 f MSVCRTD:utility.obj + 0003:00000880 hid_enumerate$rtcName$0 000000018005f880 hid-windows.obj + 0003:00000898 hid_enumerate$rtcName$1 000000018005f898 hid-windows.obj + 0003:000008a8 hid_enumerate$rtcName$2 000000018005f8a8 hid-windows.obj + 0003:000008c0 hid_enumerate$rtcName$3 000000018005f8c0 hid-windows.obj + 0003:000008d0 hid_enumerate$rtcName$4 000000018005f8d0 hid-windows.obj + 0003:000008d8 hid_enumerate$rtcName$5 000000018005f8d8 hid-windows.obj + 0003:000008e8 hid_enumerate$rtcName$6 000000018005f8e8 hid-windows.obj + 0003:000008f0 hid_enumerate$rtcName$7 000000018005f8f0 hid-windows.obj + 0003:000008f8 hid_enumerate$rtcName$8 000000018005f8f8 hid-windows.obj + 0003:00000900 hid_enumerate$rtcName$9 000000018005f900 hid-windows.obj + 0003:00000908 hid_enumerate$rtcFrameData 000000018005f908 hid-windows.obj + 0003:00000920 hid_enumerate$rtcVarDesc 000000018005f920 hid-windows.obj + 0003:00000c40 hid_open_path$rtcName$0 000000018005fc40 hid-windows.obj + 0003:00000c48 hid_open_path$rtcName$1 000000018005fc48 hid-windows.obj + 0003:00000c50 hid_open_path$rtcVarDesc 000000018005fc50 hid-windows.obj + 0003:00000cd0 hid_open_path$rtcFrameData 000000018005fcd0 hid-windows.obj + 0003:00000d00 hid_write$rtcName$0 000000018005fd00 hid-windows.obj + 0003:00000d10 hid_write$rtcName$1 000000018005fd10 hid-windows.obj + 0003:00000d20 hid_write$rtcVarDesc 000000018005fd20 hid-windows.obj + 0003:00000da0 hid_write$rtcFrameData 000000018005fda0 hid-windows.obj + 0003:00000de0 hid_read_timeout$rtcName$0 000000018005fde0 hid-windows.obj + 0003:00000df0 hid_read_timeout$rtcVarDesc 000000018005fdf0 hid-windows.obj + 0003:00000e30 hid_read_timeout$rtcFrameData 000000018005fe30 hid-windows.obj + 0003:00000e60 hid_get_feature_report$rtcName$0 000000018005fe60 hid-windows.obj + 0003:00000e70 hid_get_feature_report$rtcName$1 000000018005fe70 hid-windows.obj + 0003:00000e80 hid_get_feature_report$rtcVarDesc 000000018005fe80 hid-windows.obj + 0003:00000f00 hid_get_feature_report$rtcFrameData 000000018005ff00 hid-windows.obj + 0003:00000f40 register_error$rtcName$0 000000018005ff40 hid-windows.obj + 0003:00000f50 register_error$rtcVarDesc 000000018005ff50 hid-windows.obj + 0003:00000f90 register_error$rtcFrameData 000000018005ff90 hid-windows.obj + 0003:000011b0 fprintf$rtcName$0 00000001800601b0 json_helpers.obj + 0003:000011c0 fprintf$rtcVarDesc 00000001800601c0 json_helpers.obj + 0003:00001200 fprintf$rtcFrameData 0000000180060200 json_helpers.obj + 0003:00001230 json_write_float_array$rtcName$0 0000000180060230 json_helpers.obj + 0003:00001238 json_write_float_array$rtcName$1 0000000180060238 json_helpers.obj + 0003:00001240 json_write_float_array$rtcVarDesc 0000000180060240 json_helpers.obj + 0003:000012c0 json_write_float_array$rtcFrameData 00000001800602c0 json_helpers.obj + 0003:000012f0 json_write_double_array$rtcName$0 00000001800602f0 json_helpers.obj + 0003:000012f8 json_write_double_array$rtcName$1 00000001800602f8 json_helpers.obj + 0003:00001300 json_write_double_array$rtcVarDesc 0000000180060300 json_helpers.obj + 0003:00001380 json_write_double_array$rtcFrameData 0000000180060380 json_helpers.obj + 0003:000013b0 parse_float_array$rtcName$0 00000001800603b0 json_helpers.obj + 0003:000013c0 parse_float_array$rtcVarDesc 00000001800603c0 json_helpers.obj + 0003:00001400 parse_float_array$rtcFrameData 0000000180060400 json_helpers.obj + 0003:00001430 json_load_file$rtcName$0 0000000180060430 json_helpers.obj + 0003:00001438 json_load_file$rtcName$1 0000000180060438 json_helpers.obj + 0003:00001440 json_load_file$rtcVarDesc 0000000180060440 json_helpers.obj + 0003:000014c0 json_load_file$rtcFrameData 00000001800604c0 json_helpers.obj + 0003:000014f0 asprintf$rtcName$0 00000001800604f0 json_helpers.obj + 0003:00001500 asprintf$rtcVarDesc 0000000180060500 json_helpers.obj + 0003:00001540 asprintf$rtcFrameData 0000000180060540 json_helpers.obj + 0003:00001570 json_load_array$rtcName$0 0000000180060570 json_helpers.obj + 0003:00001580 json_load_array$rtcVarDesc 0000000180060580 json_helpers.obj + 0003:000015c0 json_load_array$rtcFrameData 00000001800605c0 json_helpers.obj + 0003:00001640 anglebetween3d$rtcName$0 0000000180060640 linmath.obj + 0003:00001644 anglebetween3d$rtcName$1 0000000180060644 linmath.obj + 0003:00001650 anglebetween3d$rtcVarDesc 0000000180060650 linmath.obj + 0003:000016d0 anglebetween3d$rtcFrameData 00000001800606d0 linmath.obj + 0003:00001700 angleaxisfrom2vect$rtcName$0 0000000180060700 linmath.obj + 0003:00001704 angleaxisfrom2vect$rtcName$1 0000000180060704 linmath.obj + 0003:00001710 angleaxisfrom2vect$rtcVarDesc 0000000180060710 linmath.obj + 0003:00001790 angleaxisfrom2vect$rtcFrameData 0000000180060790 linmath.obj + 0003:000017c0 axisanglefromquat$rtcName$0 00000001800607c0 linmath.obj + 0003:000017d0 axisanglefromquat$rtcVarDesc 00000001800607d0 linmath.obj + 0003:00001810 axisanglefromquat$rtcFrameData 0000000180060810 linmath.obj + 0003:00001840 quatfromaxisangle$rtcName$0 0000000180060840 linmath.obj + 0003:00001850 quatfromaxisangle$rtcVarDesc 0000000180060850 linmath.obj + 0003:00001890 quatfromaxisangle$rtcFrameData 0000000180060890 linmath.obj + 0003:000018c0 quattomatrix$rtcName$0 00000001800608c0 linmath.obj + 0003:000018d0 quattomatrix$rtcVarDesc 00000001800608d0 linmath.obj + 0003:00001910 quattomatrix$rtcFrameData 0000000180060910 linmath.obj + 0003:00001940 quatslerp$rtcName$0 0000000180060940 linmath.obj + 0003:00001944 quatslerp$rtcName$1 0000000180060944 linmath.obj + 0003:00001948 quatslerp$rtcName$2 0000000180060948 linmath.obj + 0003:00001950 quatslerp$rtcName$3 0000000180060950 linmath.obj + 0003:00001958 quatslerp$rtcFrameData 0000000180060958 linmath.obj + 0003:00001970 quatslerp$rtcVarDesc 0000000180060970 linmath.obj + 0003:00001ab0 quatrotatevector$rtcName$0 0000000180060ab0 linmath.obj + 0003:00001ab4 quatrotatevector$rtcName$1 0000000180060ab4 linmath.obj + 0003:00001ac0 quatrotatevector$rtcVarDesc 0000000180060ac0 linmath.obj + 0003:00001b40 quatrotatevector$rtcFrameData 0000000180060b40 linmath.obj + 0003:00001b70 quatfrom2vectors$rtcName$0 0000000180060b70 linmath.obj + 0003:00001b74 quatfrom2vectors$rtcName$1 0000000180060b74 linmath.obj + 0003:00001b78 quatfrom2vectors$rtcName$2 0000000180060b78 linmath.obj + 0003:00001b80 quatfrom2vectors$rtcName$3 0000000180060b80 linmath.obj + 0003:00001b88 quatfrom2vectors$rtcName$4 0000000180060b88 linmath.obj + 0003:00001b90 quatfrom2vectors$rtcName$5 0000000180060b90 linmath.obj + 0003:00001b98 quatfrom2vectors$rtcFrameData 0000000180060b98 linmath.obj + 0003:00001bb0 quatfrom2vectors$rtcVarDesc 0000000180060bb0 linmath.obj + 0003:00001d90 rotation_between_vecs_to_m3$rtcName$0 0000000180060d90 linmath.obj + 0003:00001da0 rotation_between_vecs_to_m3$rtcVarDesc 0000000180060da0 linmath.obj + 0003:00001de0 rotation_between_vecs_to_m3$rtcFrameData 0000000180060de0 linmath.obj + 0003:00001e10 inverseM33$rtcName$0 0000000180060e10 linmath.obj + 0003:00001e20 inverseM33$rtcVarDesc 0000000180060e20 linmath.obj + 0003:00001e60 inverseM33$rtcFrameData 0000000180060e60 linmath.obj + 0003:00001e90 quattomatrix33$rtcName$0 0000000180060e90 linmath.obj + 0003:00001ea0 quattomatrix33$rtcVarDesc 0000000180060ea0 linmath.obj + 0003:00001ee0 quattomatrix33$rtcFrameData 0000000180060ee0 linmath.obj + 0003:00002000 OGGetAbsoluteTime$rtcName$0 0000000180061000 os_generic.obj + 0003:00002010 OGGetAbsoluteTime$rtcVarDesc 0000000180061010 os_generic.obj + 0003:00002050 OGGetAbsoluteTime$rtcFrameData 0000000180061050 os_generic.obj + 0003:00002080 OGGetFileTime$rtcName$0 0000000180061080 os_generic.obj + 0003:00002090 OGGetFileTime$rtcVarDesc 0000000180061090 os_generic.obj + 0003:000020d0 OGGetFileTime$rtcFrameData 00000001800610d0 os_generic.obj + 0003:00002100 OGGetSema$rtcName$0 0000000180061100 os_generic.obj + 0003:00002110 OGGetSema$rtcVarDesc 0000000180061110 os_generic.obj + 0003:00002150 OGGetSema$rtcFrameData 0000000180061150 os_generic.obj + 0003:000021a0 ?lens@?1??codes@@9@9 00000001800611a0 puff.obj + 0003:000021e0 ?lext@?1??codes@@9@9 00000001800611e0 puff.obj + 0003:00002220 ?dists@?1??codes@@9@9 0000000180061220 puff.obj + 0003:00002260 ?dext@?1??codes@@9@9 0000000180061260 puff.obj + 0003:000022a0 ?order@?1??dynamic@@9@9 00000001800612a0 puff.obj + 0003:00002300 puff$rtcName$0 0000000180061300 puff.obj + 0003:00002310 puff$rtcVarDesc 0000000180061310 puff.obj + 0003:00002350 puff$rtcFrameData 0000000180061350 puff.obj + 0003:00002380 construct$rtcName$0 0000000180061380 puff.obj + 0003:00002390 construct$rtcVarDesc 0000000180061390 puff.obj + 0003:000023d0 construct$rtcFrameData 00000001800613d0 puff.obj + 0003:00002400 fixed$rtcName$0 0000000180061400 puff.obj + 0003:00002410 fixed$rtcVarDesc 0000000180061410 puff.obj + 0003:00002450 fixed$rtcFrameData 0000000180061450 puff.obj + 0003:00002480 dynamic$rtcName$0 0000000180061480 puff.obj + 0003:00002488 dynamic$rtcName$1 0000000180061488 puff.obj + 0003:00002490 dynamic$rtcName$2 0000000180061490 puff.obj + 0003:00002498 dynamic$rtcName$3 0000000180061498 puff.obj + 0003:000024a0 dynamic$rtcName$4 00000001800614a0 puff.obj + 0003:000024a8 dynamic$rtcName$5 00000001800614a8 puff.obj + 0003:000024b0 dynamic$rtcName$6 00000001800614b0 puff.obj + 0003:000024c0 dynamic$rtcVarDesc 00000001800614c0 puff.obj + 0003:00002680 dynamic$rtcFrameData 0000000180061680 puff.obj + 0003:00002700 printf$rtcName$0 0000000180061700 ootx_decoder.obj + 0003:00002710 printf$rtcVarDesc 0000000180061710 ootx_decoder.obj + 0003:00002750 printf$rtcFrameData 0000000180061750 ootx_decoder.obj + 0003:00002780 init_lighthouse_info_v6$rtcName$0 0000000180061780 ootx_decoder.obj + 0003:00002790 init_lighthouse_info_v6$rtcVarDesc 0000000180061790 ootx_decoder.obj + 0003:000027d0 init_lighthouse_info_v6$rtcFrameData 00000001800617d0 ootx_decoder.obj + 0003:00002800 ootx_pump_bit$rtcName$0 0000000180061800 ootx_decoder.obj + 0003:00002810 ootx_pump_bit$rtcVarDesc 0000000180061810 ootx_decoder.obj + 0003:00002850 ootx_pump_bit$rtcFrameData 0000000180061850 ootx_decoder.obj + 0003:00002880 _half_to_float$rtcName$0 0000000180061880 ootx_decoder.obj + 0003:00002890 _half_to_float$rtcVarDesc 0000000180061890 ootx_decoder.obj + 0003:000028d0 _half_to_float$rtcFrameData 00000001800618d0 ootx_decoder.obj + 0003:00002960 PoserData_lighthouse_pose_func$rtcName$0 0000000180061960 poser.obj + 0003:00002968 PoserData_lighthouse_pose_func$rtcName$1 0000000180061968 poser.obj + 0003:00002978 PoserData_lighthouse_pose_func$rtcName$2 0000000180061978 poser.obj + 0003:00002988 PoserData_lighthouse_pose_func$rtcName$3 0000000180061988 poser.obj + 0003:00002998 PoserData_lighthouse_pose_func$rtcName$4 0000000180061998 poser.obj + 0003:000029a8 PoserData_lighthouse_pose_func$rtcName$5 00000001800619a8 poser.obj + 0003:000029bc PoserData_lighthouse_pose_func$rtcName$7 00000001800619bc poser.obj + 0003:000029c8 PoserData_lighthouse_pose_func$rtcName$6 00000001800619c8 poser.obj + 0003:000029d8 PoserData_lighthouse_pose_func$rtcName$8 00000001800619d8 poser.obj + 0003:000029e8 PoserData_lighthouse_pose_func$rtcName$9 00000001800619e8 poser.obj + 0003:00002a00 PoserData_lighthouse_pose_func$rtcVarDesc 0000000180061a00 poser.obj + 0003:00002c80 PoserData_lighthouse_pose_func$rtcFrameData 0000000180061c80 poser.obj + 0003:00002d50 sprintf$rtcName$0 0000000180061d50 poser_charlesslow.obj + 0003:00002d60 sprintf$rtcVarDesc 0000000180061d60 poser_charlesslow.obj + 0003:00002da0 sprintf$rtcFrameData 0000000180061da0 poser_charlesslow.obj + 0003:00002dd0 RunOpti$rtcName$0 0000000180061dd0 poser_charlesslow.obj + 0003:00002de0 RunOpti$rtcName$1 0000000180061de0 poser_charlesslow.obj + 0003:00002df0 RunOpti$rtcName$2 0000000180061df0 poser_charlesslow.obj + 0003:00002e00 RunOpti$rtcName$3 0000000180061e00 poser_charlesslow.obj + 0003:00002e10 RunOpti$rtcName$4 0000000180061e10 poser_charlesslow.obj + 0003:00002e24 RunOpti$rtcName$8 0000000180061e24 poser_charlesslow.obj + 0003:00002e30 RunOpti$rtcName$5 0000000180061e30 poser_charlesslow.obj + 0003:00002e40 RunOpti$rtcName$6 0000000180061e40 poser_charlesslow.obj + 0003:00002e50 RunOpti$rtcName$7 0000000180061e50 poser_charlesslow.obj + 0003:00002e60 RunOpti$rtcName$9 0000000180061e60 poser_charlesslow.obj + 0003:00002e68 RunOpti$rtcName$10 0000000180061e68 poser_charlesslow.obj + 0003:00002e78 RunOpti$rtcName$11 0000000180061e78 poser_charlesslow.obj + 0003:00002e88 RunOpti$rtcFrameData 0000000180061e88 poser_charlesslow.obj + 0003:00002ea0 RunOpti$rtcVarDesc 0000000180061ea0 poser_charlesslow.obj + 0003:00003270 PoserCharlesSlow$rtcName$0 0000000180062270 poser_charlesslow.obj + 0003:00003280 PoserCharlesSlow$rtcName$1 0000000180062280 poser_charlesslow.obj + 0003:00003290 PoserCharlesSlow$rtcName$2 0000000180062290 poser_charlesslow.obj + 0003:000032a0 PoserCharlesSlow$rtcName$3 00000001800622a0 poser_charlesslow.obj + 0003:000032a8 PoserCharlesSlow$rtcName$4 00000001800622a8 poser_charlesslow.obj + 0003:000032b8 PoserCharlesSlow$rtcName$5 00000001800622b8 poser_charlesslow.obj + 0003:000032c4 PoserCharlesSlow$rtcName$6 00000001800622c4 poser_charlesslow.obj + 0003:000032cc PoserCharlesSlow$rtcName$8 00000001800622cc poser_charlesslow.obj + 0003:000032d0 PoserCharlesSlow$rtcName$7 00000001800622d0 poser_charlesslow.obj + 0003:000032e0 PoserCharlesSlow$rtcName$9 00000001800622e0 poser_charlesslow.obj + 0003:000032f0 PoserCharlesSlow$rtcVarDesc 00000001800622f0 poser_charlesslow.obj + 0003:00003570 PoserCharlesSlow$rtcFrameData 0000000180062570 poser_charlesslow.obj + 0003:000037b0 OrthoSolve$rtcName$0 00000001800627b0 poser_daveortho.obj + 0003:000037b4 OrthoSolve$rtcName$1 00000001800627b4 poser_daveortho.obj + 0003:000037bc OrthoSolve$rtcName$2 00000001800627bc poser_daveortho.obj + 0003:000037c4 OrthoSolve$rtcName$3 00000001800627c4 poser_daveortho.obj + 0003:000037cc OrthoSolve$rtcName$4 00000001800627cc poser_daveortho.obj + 0003:000037d0 OrthoSolve$rtcName$5 00000001800627d0 poser_daveortho.obj + 0003:000037d4 OrthoSolve$rtcName$6 00000001800627d4 poser_daveortho.obj + 0003:000037d8 OrthoSolve$rtcName$7 00000001800627d8 poser_daveortho.obj + 0003:000037dc OrthoSolve$rtcName$8 00000001800627dc poser_daveortho.obj + 0003:000037e4 OrthoSolve$rtcName$9 00000001800627e4 poser_daveortho.obj + 0003:000037e8 OrthoSolve$rtcName$10 00000001800627e8 poser_daveortho.obj + 0003:000037ec OrthoSolve$rtcName$11 00000001800627ec poser_daveortho.obj + 0003:000037f4 OrthoSolve$rtcName$12 00000001800627f4 poser_daveortho.obj + 0003:000037f8 OrthoSolve$rtcName$13 00000001800627f8 poser_daveortho.obj + 0003:000037fc OrthoSolve$rtcName$14 00000001800627fc poser_daveortho.obj + 0003:00003800 OrthoSolve$rtcName$15 0000000180062800 poser_daveortho.obj + 0003:00003804 OrthoSolve$rtcName$16 0000000180062804 poser_daveortho.obj + 0003:00003808 OrthoSolve$rtcName$17 0000000180062808 poser_daveortho.obj + 0003:00003810 OrthoSolve$rtcName$18 0000000180062810 poser_daveortho.obj + 0003:00003814 OrthoSolve$rtcName$19 0000000180062814 poser_daveortho.obj + 0003:00003818 OrthoSolve$rtcName$20 0000000180062818 poser_daveortho.obj + 0003:00003820 OrthoSolve$rtcName$21 0000000180062820 poser_daveortho.obj + 0003:00003824 OrthoSolve$rtcName$22 0000000180062824 poser_daveortho.obj + 0003:0000382c OrthoSolve$rtcName$23 000000018006282c poser_daveortho.obj + 0003:00003830 OrthoSolve$rtcName$24 0000000180062830 poser_daveortho.obj + 0003:00003834 OrthoSolve$rtcName$25 0000000180062834 poser_daveortho.obj + 0003:00003838 OrthoSolve$rtcName$26 0000000180062838 poser_daveortho.obj + 0003:0000383c OrthoSolve$rtcName$27 000000018006283c poser_daveortho.obj + 0003:00003840 OrthoSolve$rtcName$28 0000000180062840 poser_daveortho.obj + 0003:00003844 OrthoSolve$rtcName$29 0000000180062844 poser_daveortho.obj + 0003:00003848 OrthoSolve$rtcName$30 0000000180062848 poser_daveortho.obj + 0003:0000384c OrthoSolve$rtcName$31 000000018006284c poser_daveortho.obj + 0003:00003854 OrthoSolve$rtcName$32 0000000180062854 poser_daveortho.obj + 0003:0000385c OrthoSolve$rtcName$33 000000018006285c poser_daveortho.obj + 0003:00003864 OrthoSolve$rtcName$34 0000000180062864 poser_daveortho.obj + 0003:00003868 OrthoSolve$rtcName$35 0000000180062868 poser_daveortho.obj + 0003:0000386c OrthoSolve$rtcName$36 000000018006286c poser_daveortho.obj + 0003:00003870 OrthoSolve$rtcVarDesc 0000000180062870 poser_daveortho.obj + 0003:000041b0 OrthoSolve$rtcFrameData 00000001800631b0 poser_daveortho.obj + 0003:000043d0 PoserDaveOrtho$rtcName$0 00000001800633d0 poser_daveortho.obj + 0003:000043d8 PoserDaveOrtho$rtcName$1 00000001800633d8 poser_daveortho.obj + 0003:000043e0 PoserDaveOrtho$rtcName$2 00000001800633e0 poser_daveortho.obj + 0003:000043e8 PoserDaveOrtho$rtcName$3 00000001800633e8 poser_daveortho.obj + 0003:000043f0 PoserDaveOrtho$rtcName$4 00000001800633f0 poser_daveortho.obj + 0003:000043f8 PoserDaveOrtho$rtcName$5 00000001800633f8 poser_daveortho.obj + 0003:000043fc PoserDaveOrtho$rtcName$14 00000001800633fc poser_daveortho.obj + 0003:00004400 PoserDaveOrtho$rtcName$6 0000000180063400 poser_daveortho.obj + 0003:0000440c PoserDaveOrtho$rtcName$12 000000018006340c poser_daveortho.obj + 0003:00004414 PoserDaveOrtho$rtcName$15 0000000180063414 poser_daveortho.obj + 0003:00004418 PoserDaveOrtho$rtcName$7 0000000180063418 poser_daveortho.obj + 0003:00004428 PoserDaveOrtho$rtcName$8 0000000180063428 poser_daveortho.obj + 0003:00004438 PoserDaveOrtho$rtcName$9 0000000180063438 poser_daveortho.obj + 0003:00004440 PoserDaveOrtho$rtcName$10 0000000180063440 poser_daveortho.obj + 0003:00004448 PoserDaveOrtho$rtcName$11 0000000180063448 poser_daveortho.obj + 0003:00004450 PoserDaveOrtho$rtcName$13 0000000180063450 poser_daveortho.obj + 0003:00004458 PoserDaveOrtho$rtcName$16 0000000180063458 poser_daveortho.obj + 0003:00004460 PoserDaveOrtho$rtcVarDesc 0000000180063460 poser_daveortho.obj + 0003:000048a0 PoserDaveOrtho$rtcFrameData 00000001800638a0 poser_daveortho.obj + 0003:00004ae0 getGradient$rtcName$0 0000000180063ae0 poser_octavioradii.obj + 0003:00004af0 getGradient$rtcVarDesc 0000000180063af0 poser_octavioradii.obj + 0003:00004b30 getGradient$rtcFrameData 0000000180063b30 poser_octavioradii.obj + 0003:00004b60 RefineEstimateUsingGradientDescentRadii$rtcName$0 0000000180063b60 poser_octavioradii.obj + 0003:00004b68 RefineEstimateUsingGradientDescentRadii$rtcName$1 0000000180063b68 poser_octavioradii.obj + 0003:00004b74 RefineEstimateUsingGradientDescentRadii$rtcName$2 0000000180063b74 poser_octavioradii.obj + 0003:00004b80 RefineEstimateUsingGradientDescentRadii$rtcName$3 0000000180063b80 poser_octavioradii.obj + 0003:00004b8c RefineEstimateUsingGradientDescentRadii$rtcName$4 0000000180063b8c poser_octavioradii.obj + 0003:00004b98 RefineEstimateUsingGradientDescentRadii$rtcName$5 0000000180063b98 poser_octavioradii.obj + 0003:00004ba8 RefineEstimateUsingGradientDescentRadii$rtcName$6 0000000180063ba8 poser_octavioradii.obj + 0003:00004bb0 RefineEstimateUsingGradientDescentRadii$rtcVarDesc 0000000180063bb0 poser_octavioradii.obj + 0003:00004d70 RefineEstimateUsingGradientDescentRadii$rtcFrameData 0000000180063d70 poser_octavioradii.obj + 0003:00004df0 SolveForLighthouseRadii$rtcName$0 0000000180063df0 poser_octavioradii.obj + 0003:00004dfc SolveForLighthouseRadii$rtcName$1 0000000180063dfc poser_octavioradii.obj + 0003:00004e04 SolveForLighthouseRadii$rtcName$2 0000000180063e04 poser_octavioradii.obj + 0003:00004e10 SolveForLighthouseRadii$rtcVarDesc 0000000180063e10 poser_octavioradii.obj + 0003:00004ed0 SolveForLighthouseRadii$rtcFrameData 0000000180063ed0 poser_octavioradii.obj + 0003:00004f10 QuickPose$rtcName$0 0000000180063f10 poser_octavioradii.obj + 0003:00004f18 QuickPose$rtcName$1 0000000180063f18 poser_octavioradii.obj + 0003:00004f20 QuickPose$rtcName$2 0000000180063f20 poser_octavioradii.obj + 0003:00004f24 QuickPose$rtcName$3 0000000180063f24 poser_octavioradii.obj + 0003:00004f30 QuickPose$rtcVarDesc 0000000180063f30 poser_octavioradii.obj + 0003:00005030 QuickPose$rtcFrameData 0000000180064030 poser_octavioradii.obj + 0003:00005080 PoserOctavioRadii$rtcName$0 0000000180064080 poser_octavioradii.obj + 0003:00005090 PoserOctavioRadii$rtcName$1 0000000180064090 poser_octavioradii.obj + 0003:000050a0 PoserOctavioRadii$rtcName$2 00000001800640a0 poser_octavioradii.obj + 0003:000050b0 PoserOctavioRadii$rtcName$3 00000001800640b0 poser_octavioradii.obj + 0003:000050c0 PoserOctavioRadii$rtcVarDesc 00000001800640c0 poser_octavioradii.obj + 0003:000051c0 PoserOctavioRadii$rtcFrameData 00000001800641c0 poser_octavioradii.obj + 0003:000052d0 WORLD_BOUNDS 00000001800642d0 poser_turveytori.obj + 0003:000052d8 DefaultPointsPerOuterDiameter 00000001800642d8 poser_turveytori.obj + 0003:000052e0 GetRotationMatrixForTorus$rtcName$0 00000001800642e0 poser_turveytori.obj + 0003:000052e8 GetRotationMatrixForTorus$rtcName$1 00000001800642e8 poser_turveytori.obj + 0003:000052ec GetRotationMatrixForTorus$rtcName$2 00000001800642ec poser_turveytori.obj + 0003:000052f0 GetRotationMatrixForTorus$rtcVarDesc 00000001800642f0 poser_turveytori.obj + 0003:000053b0 GetRotationMatrixForTorus$rtcFrameData 00000001800643b0 poser_turveytori.obj + 0003:000053f0 RotateAndTranslatePoint$rtcName$0 00000001800643f0 poser_turveytori.obj + 0003:000053f4 RotateAndTranslatePoint$rtcName$1 00000001800643f4 poser_turveytori.obj + 0003:00005400 RotateAndTranslatePoint$rtcVarDesc 0000000180064400 poser_turveytori.obj + 0003:00005480 RotateAndTranslatePoint$rtcFrameData 0000000180064480 poser_turveytori.obj + 0003:000054b0 angleFromPoints$rtcName$0 00000001800644b0 poser_turveytori.obj + 0003:000054b4 angleFromPoints$rtcName$1 00000001800644b4 poser_turveytori.obj + 0003:000054b8 angleFromPoints$rtcName$2 00000001800644b8 poser_turveytori.obj + 0003:000054c0 angleFromPoints$rtcName$3 00000001800644c0 poser_turveytori.obj + 0003:000054c8 angleFromPoints$rtcFrameData 00000001800644c8 poser_turveytori.obj + 0003:000054e0 angleFromPoints$rtcVarDesc 00000001800644e0 poser_turveytori.obj + 0003:00005620 midpoint$rtcName$0 0000000180064620 poser_turveytori.obj + 0003:00005630 midpoint$rtcVarDesc 0000000180064630 poser_turveytori.obj + 0003:00005670 midpoint$rtcFrameData 0000000180064670 poser_turveytori.obj + 0003:000056a0 estimateToroidalAndPoloidalAngleOfPoint$rtcName$0 00000001800646a0 poser_turveytori.obj + 0003:000056a4 estimateToroidalAndPoloidalAngleOfPoint$rtcName$1 00000001800646a4 poser_turveytori.obj + 0003:000056ac estimateToroidalAndPoloidalAngleOfPoint$rtcName$2 00000001800646ac poser_turveytori.obj + 0003:000056b0 estimateToroidalAndPoloidalAngleOfPoint$rtcName$3 00000001800646b0 poser_turveytori.obj + 0003:000056b8 estimateToroidalAndPoloidalAngleOfPoint$rtcName$4 00000001800646b8 poser_turveytori.obj + 0003:000056c0 estimateToroidalAndPoloidalAngleOfPoint$rtcName$5 00000001800646c0 poser_turveytori.obj + 0003:000056c8 estimateToroidalAndPoloidalAngleOfPoint$rtcFrameData 00000001800646c8 poser_turveytori.obj + 0003:000056e0 estimateToroidalAndPoloidalAngleOfPoint$rtcVarDesc 00000001800646e0 poser_turveytori.obj + 0003:000058c0 calculateTorusPointFromAngles$rtcName$0 00000001800648c0 poser_turveytori.obj + 0003:000058c8 calculateTorusPointFromAngles$rtcName$1 00000001800648c8 poser_turveytori.obj + 0003:000058cc calculateTorusPointFromAngles$rtcName$2 00000001800648cc poser_turveytori.obj + 0003:000058d0 calculateTorusPointFromAngles$rtcVarDesc 00000001800648d0 poser_turveytori.obj + 0003:00005990 calculateTorusPointFromAngles$rtcFrameData 0000000180064990 poser_turveytori.obj + 0003:000059d0 getPointFitnessForPna$rtcName$0 00000001800649d0 poser_turveytori.obj + 0003:000059e0 getPointFitnessForPna$rtcName$1 00000001800649e0 poser_turveytori.obj + 0003:000059f0 getPointFitnessForPna$rtcName$2 00000001800649f0 poser_turveytori.obj + 0003:00005a00 getPointFitnessForPna$rtcName$3 0000000180064a00 poser_turveytori.obj + 0003:00005a10 getPointFitnessForPna$rtcName$4 0000000180064a10 poser_turveytori.obj + 0003:00005a20 getPointFitnessForPna$rtcVarDesc 0000000180064a20 poser_turveytori.obj + 0003:00005b60 getPointFitnessForPna$rtcFrameData 0000000180064b60 poser_turveytori.obj + 0003:00005bd0 getPointFitness$rtcName$0 0000000180064bd0 poser_turveytori.obj + 0003:00005be0 getPointFitness$rtcVarDesc 0000000180064be0 poser_turveytori.obj + 0003:00005c20 getPointFitness$rtcFrameData 0000000180064c20 poser_turveytori.obj + 0003:00005c50 getGradient$rtcName$0 0000000180064c50 poser_turveytori.obj + 0003:00005c58 getGradient$rtcName$1 0000000180064c58 poser_turveytori.obj + 0003:00005c68 getGradient$rtcName$2 0000000180064c68 poser_turveytori.obj + 0003:00005c78 getGradient$rtcName$3 0000000180064c78 poser_turveytori.obj + 0003:00005c88 getGradient$rtcName$4 0000000180064c88 poser_turveytori.obj + 0003:00005c98 getGradient$rtcName$5 0000000180064c98 poser_turveytori.obj + 0003:00005ca8 getGradient$rtcName$6 0000000180064ca8 poser_turveytori.obj + 0003:00005cc0 getGradient$rtcVarDesc 0000000180064cc0 poser_turveytori.obj + 0003:00005e80 getGradient$rtcFrameData 0000000180064e80 poser_turveytori.obj + 0003:00005f10 getNormalizedAndScaledVector$rtcName$0 0000000180064f10 poser_turveytori.obj + 0003:00005f20 getNormalizedAndScaledVector$rtcVarDesc 0000000180064f20 poser_turveytori.obj + 0003:00005f60 getNormalizedAndScaledVector$rtcFrameData 0000000180064f60 poser_turveytori.obj + 0003:00005f90 getAvgPoints$rtcName$0 0000000180064f90 poser_turveytori.obj + 0003:00005fa0 getAvgPoints$rtcVarDesc 0000000180064fa0 poser_turveytori.obj + 0003:00005fe0 getAvgPoints$rtcFrameData 0000000180064fe0 poser_turveytori.obj + 0003:00006010 RefineEstimateUsingModifiedGradientDescent1$rtcName$0 0000000180065010 poser_turveytori.obj + 0003:0000601c RefineEstimateUsingModifiedGradientDescent1$rtcName$1 000000018006501c poser_turveytori.obj + 0003:00006028 RefineEstimateUsingModifiedGradientDescent1$rtcName$2 0000000180065028 poser_turveytori.obj + 0003:00006038 RefineEstimateUsingModifiedGradientDescent1$rtcName$3 0000000180065038 poser_turveytori.obj + 0003:00006044 RefineEstimateUsingModifiedGradientDescent1$rtcName$4 0000000180065044 poser_turveytori.obj + 0003:00006050 RefineEstimateUsingModifiedGradientDescent1$rtcName$5 0000000180065050 poser_turveytori.obj + 0003:00006060 RefineEstimateUsingModifiedGradientDescent1$rtcName$6 0000000180065060 poser_turveytori.obj + 0003:0000606c RefineEstimateUsingModifiedGradientDescent1$rtcName$7 000000018006506c poser_turveytori.obj + 0003:00006078 RefineEstimateUsingModifiedGradientDescent1$rtcName$8 0000000180065078 poser_turveytori.obj + 0003:00006088 RefineEstimateUsingModifiedGradientDescent1$rtcName$9 0000000180065088 poser_turveytori.obj + 0003:00006090 RefineEstimateUsingModifiedGradientDescent1$rtcVarDesc 0000000180065090 poser_turveytori.obj + 0003:00006310 RefineEstimateUsingModifiedGradientDescent1$rtcFrameData 0000000180065310 poser_turveytori.obj + 0003:000063c0 RotationEstimateFitnessOld$rtcName$0 00000001800653c0 poser_turveytori.obj + 0003:000063c4 RotationEstimateFitnessOld$rtcName$1 00000001800653c4 poser_turveytori.obj + 0003:000063c8 RotationEstimateFitnessOld$rtcName$2 00000001800653c8 poser_turveytori.obj + 0003:000063d0 RotationEstimateFitnessOld$rtcName$3 00000001800653d0 poser_turveytori.obj + 0003:000063d4 RotationEstimateFitnessOld$rtcName$4 00000001800653d4 poser_turveytori.obj + 0003:000063d8 RotationEstimateFitnessOld$rtcName$5 00000001800653d8 poser_turveytori.obj + 0003:000063e0 RotationEstimateFitnessOld$rtcName$6 00000001800653e0 poser_turveytori.obj + 0003:00006400 RotationEstimateFitnessOld$rtcName$7 0000000180065400 poser_turveytori.obj + 0003:00006420 RotationEstimateFitnessOld$rtcName$8 0000000180065420 poser_turveytori.obj + 0003:00006430 RotationEstimateFitnessOld$rtcVarDesc 0000000180065430 poser_turveytori.obj + 0003:00006670 RotationEstimateFitnessOld$rtcFrameData 0000000180065670 poser_turveytori.obj + 0003:00006710 RotationEstimateFitnessAxisAngle$rtcName$0 0000000180065710 poser_turveytori.obj + 0003:00006720 RotationEstimateFitnessAxisAngle$rtcName$1 0000000180065720 poser_turveytori.obj + 0003:00006730 RotationEstimateFitnessAxisAngle$rtcName$2 0000000180065730 poser_turveytori.obj + 0003:00006740 RotationEstimateFitnessAxisAngle$rtcVarDesc 0000000180065740 poser_turveytori.obj + 0003:00006800 RotationEstimateFitnessAxisAngle$rtcFrameData 0000000180065800 poser_turveytori.obj + 0003:00006850 RotationEstimateFitnessAxisAngleOriginal$rtcName$0 0000000180065850 poser_turveytori.obj + 0003:00006854 RotationEstimateFitnessAxisAngleOriginal$rtcName$1 0000000180065854 poser_turveytori.obj + 0003:00006858 RotationEstimateFitnessAxisAngleOriginal$rtcName$2 0000000180065858 poser_turveytori.obj + 0003:00006860 RotationEstimateFitnessAxisAngleOriginal$rtcName$3 0000000180065860 poser_turveytori.obj + 0003:00006864 RotationEstimateFitnessAxisAngleOriginal$rtcName$4 0000000180065864 poser_turveytori.obj + 0003:00006868 RotationEstimateFitnessAxisAngleOriginal$rtcName$5 0000000180065868 poser_turveytori.obj + 0003:00006870 RotationEstimateFitnessAxisAngleOriginal$rtcName$6 0000000180065870 poser_turveytori.obj + 0003:00006890 RotationEstimateFitnessAxisAngleOriginal$rtcName$7 0000000180065890 poser_turveytori.obj + 0003:000068b0 RotationEstimateFitnessAxisAngleOriginal$rtcName$8 00000001800658b0 poser_turveytori.obj + 0003:000068c0 RotationEstimateFitnessAxisAngleOriginal$rtcVarDesc 00000001800658c0 poser_turveytori.obj + 0003:00006b00 RotationEstimateFitnessAxisAngleOriginal$rtcFrameData 0000000180065b00 poser_turveytori.obj + 0003:00006ba0 RotationEstimateFitnessQuaternion$rtcName$0 0000000180065ba0 poser_turveytori.obj + 0003:00006bac RotationEstimateFitnessQuaternion$rtcName$1 0000000180065bac poser_turveytori.obj + 0003:00006bb0 RotationEstimateFitnessQuaternion$rtcName$2 0000000180065bb0 poser_turveytori.obj + 0003:00006bb4 RotationEstimateFitnessQuaternion$rtcName$3 0000000180065bb4 poser_turveytori.obj + 0003:00006bbc RotationEstimateFitnessQuaternion$rtcName$4 0000000180065bbc poser_turveytori.obj + 0003:00006bc0 RotationEstimateFitnessQuaternion$rtcName$5 0000000180065bc0 poser_turveytori.obj + 0003:00006bc4 RotationEstimateFitnessQuaternion$rtcName$6 0000000180065bc4 poser_turveytori.obj + 0003:00006bcc RotationEstimateFitnessQuaternion$rtcName$9 0000000180065bcc poser_turveytori.obj + 0003:00006bd0 RotationEstimateFitnessQuaternion$rtcName$7 0000000180065bd0 poser_turveytori.obj + 0003:00006bf0 RotationEstimateFitnessQuaternion$rtcName$8 0000000180065bf0 poser_turveytori.obj + 0003:00006c10 RotationEstimateFitnessQuaternion$rtcVarDesc 0000000180065c10 poser_turveytori.obj + 0003:00006e90 RotationEstimateFitnessQuaternion$rtcFrameData 0000000180065e90 poser_turveytori.obj + 0003:00006f40 getRotationGradientQuaternion$rtcName$0 0000000180065f40 poser_turveytori.obj + 0003:00006f4c getRotationGradientQuaternion$rtcName$1 0000000180065f4c poser_turveytori.obj + 0003:00006f50 getRotationGradientQuaternion$rtcName$2 0000000180065f50 poser_turveytori.obj + 0003:00006f5c getRotationGradientQuaternion$rtcName$3 0000000180065f5c poser_turveytori.obj + 0003:00006f60 getRotationGradientQuaternion$rtcName$4 0000000180065f60 poser_turveytori.obj + 0003:00006f6c getRotationGradientQuaternion$rtcName$5 0000000180065f6c poser_turveytori.obj + 0003:00006f70 getRotationGradientQuaternion$rtcName$6 0000000180065f70 poser_turveytori.obj + 0003:00006f7c getRotationGradientQuaternion$rtcName$7 0000000180065f7c poser_turveytori.obj + 0003:00006f80 getRotationGradientQuaternion$rtcVarDesc 0000000180065f80 poser_turveytori.obj + 0003:00007180 getRotationGradientQuaternion$rtcFrameData 0000000180066180 poser_turveytori.obj + 0003:00007210 getRotationGradientAxisAngle$rtcName$0 0000000180066210 poser_turveytori.obj + 0003:0000721c getRotationGradientAxisAngle$rtcName$1 000000018006621c poser_turveytori.obj + 0003:00007220 getRotationGradientAxisAngle$rtcName$2 0000000180066220 poser_turveytori.obj + 0003:0000722c getRotationGradientAxisAngle$rtcName$3 000000018006622c poser_turveytori.obj + 0003:00007230 getRotationGradientAxisAngle$rtcName$4 0000000180066230 poser_turveytori.obj + 0003:0000723c getRotationGradientAxisAngle$rtcName$5 000000018006623c poser_turveytori.obj + 0003:00007248 getRotationGradientAxisAngle$rtcName$6 0000000180066248 poser_turveytori.obj + 0003:00007254 getRotationGradientAxisAngle$rtcName$7 0000000180066254 poser_turveytori.obj + 0003:00007260 getRotationGradientAxisAngle$rtcVarDesc 0000000180066260 poser_turveytori.obj + 0003:00007460 getRotationGradientAxisAngle$rtcFrameData 0000000180066460 poser_turveytori.obj + 0003:000074f0 RefineRotationEstimateAxisAngle$rtcName$0 00000001800664f0 poser_turveytori.obj + 0003:000074f8 RefineRotationEstimateAxisAngle$rtcName$1 00000001800664f8 poser_turveytori.obj + 0003:00007504 RefineRotationEstimateAxisAngle$rtcName$2 0000000180066504 poser_turveytori.obj + 0003:00007510 RefineRotationEstimateAxisAngle$rtcName$3 0000000180066510 poser_turveytori.obj + 0003:0000751c RefineRotationEstimateAxisAngle$rtcName$4 000000018006651c poser_turveytori.obj + 0003:00007528 RefineRotationEstimateAxisAngle$rtcName$5 0000000180066528 poser_turveytori.obj + 0003:00007538 RefineRotationEstimateAxisAngle$rtcName$6 0000000180066538 poser_turveytori.obj + 0003:00007540 RefineRotationEstimateAxisAngle$rtcVarDesc 0000000180066540 poser_turveytori.obj + 0003:00007700 RefineRotationEstimateAxisAngle$rtcFrameData 0000000180066700 poser_turveytori.obj + 0003:00007780 RefineRotationEstimateQuaternion$rtcName$0 0000000180066780 poser_turveytori.obj + 0003:00007788 RefineRotationEstimateQuaternion$rtcName$1 0000000180066788 poser_turveytori.obj + 0003:00007794 RefineRotationEstimateQuaternion$rtcName$2 0000000180066794 poser_turveytori.obj + 0003:000077a0 RefineRotationEstimateQuaternion$rtcName$3 00000001800667a0 poser_turveytori.obj + 0003:000077ac RefineRotationEstimateQuaternion$rtcName$4 00000001800667ac poser_turveytori.obj + 0003:000077b8 RefineRotationEstimateQuaternion$rtcName$5 00000001800667b8 poser_turveytori.obj + 0003:000077c8 RefineRotationEstimateQuaternion$rtcName$6 00000001800667c8 poser_turveytori.obj + 0003:000077d0 RefineRotationEstimateQuaternion$rtcVarDesc 00000001800667d0 poser_turveytori.obj + 0003:00007990 RefineRotationEstimateQuaternion$rtcFrameData 0000000180066990 poser_turveytori.obj + 0003:00007a10 SolveForRotation$rtcName$0 0000000180066a10 poser_turveytori.obj + 0003:00007a18 SolveForRotation$rtcName$1 0000000180066a18 poser_turveytori.obj + 0003:00007a20 SolveForRotation$rtcVarDesc 0000000180066a20 poser_turveytori.obj + 0003:00007aa0 SolveForRotation$rtcFrameData 0000000180066aa0 poser_turveytori.obj + 0003:00007ad0 SolveForRotationQuat$rtcName$0 0000000180066ad0 poser_turveytori.obj + 0003:00007ae8 SolveForRotationQuat$rtcName$1 0000000180066ae8 poser_turveytori.obj + 0003:00007af0 SolveForRotationQuat$rtcName$2 0000000180066af0 poser_turveytori.obj + 0003:00007af8 SolveForRotationQuat$rtcFrameData 0000000180066af8 poser_turveytori.obj + 0003:00007b10 SolveForRotationQuat$rtcVarDesc 0000000180066b10 poser_turveytori.obj + 0003:00007c10 SolveForLighthouse$rtcName$0 0000000180066c10 poser_turveytori.obj + 0003:00007c14 SolveForLighthouse$rtcName$3 0000000180066c14 poser_turveytori.obj + 0003:00007c18 SolveForLighthouse$rtcName$1 0000000180066c18 poser_turveytori.obj + 0003:00007c20 SolveForLighthouse$rtcName$2 0000000180066c20 poser_turveytori.obj + 0003:00007c2c SolveForLighthouse$rtcName$5 0000000180066c2c poser_turveytori.obj + 0003:00007c30 SolveForLighthouse$rtcName$4 0000000180066c30 poser_turveytori.obj + 0003:00007c44 SolveForLighthouse$rtcName$6 0000000180066c44 poser_turveytori.obj + 0003:00007c48 SolveForLighthouse$rtcName$7 0000000180066c48 poser_turveytori.obj + 0003:00007c50 SolveForLighthouse$rtcName$8 0000000180066c50 poser_turveytori.obj + 0003:00007c58 SolveForLighthouse$rtcName$9 0000000180066c58 poser_turveytori.obj + 0003:00007c60 SolveForLighthouse$rtcName$10 0000000180066c60 poser_turveytori.obj + 0003:00007c6c SolveForLighthouse$rtcName$11 0000000180066c6c poser_turveytori.obj + 0003:00007c78 SolveForLighthouse$rtcName$12 0000000180066c78 poser_turveytori.obj + 0003:00007c88 SolveForLighthouse$rtcName$13 0000000180066c88 poser_turveytori.obj + 0003:00007c90 SolveForLighthouse$rtcName$14 0000000180066c90 poser_turveytori.obj + 0003:00007c9c SolveForLighthouse$rtcName$15 0000000180066c9c poser_turveytori.obj + 0003:00007ca4 SolveForLighthouse$rtcName$16 0000000180066ca4 poser_turveytori.obj + 0003:00007cb0 SolveForLighthouse$rtcName$17 0000000180066cb0 poser_turveytori.obj + 0003:00007cc0 SolveForLighthouse$rtcName$18 0000000180066cc0 poser_turveytori.obj + 0003:00007cc8 SolveForLighthouse$rtcName$19 0000000180066cc8 poser_turveytori.obj + 0003:00007cd8 SolveForLighthouse$rtcFrameData 0000000180066cd8 poser_turveytori.obj + 0003:00007cf0 SolveForLighthouse$rtcVarDesc 0000000180066cf0 poser_turveytori.obj + 0003:00008320 QuickPose$rtcName$0 0000000180067320 poser_turveytori.obj + 0003:00008328 QuickPose$rtcName$1 0000000180067328 poser_turveytori.obj + 0003:00008330 QuickPose$rtcName$2 0000000180067330 poser_turveytori.obj + 0003:00008338 QuickPose$rtcFrameData 0000000180067338 poser_turveytori.obj + 0003:00008350 QuickPose$rtcVarDesc 0000000180067350 poser_turveytori.obj + 0003:00008440 PoserTurveyTori$rtcName$0 0000000180067440 poser_turveytori.obj + 0003:00008450 PoserTurveyTori$rtcName$1 0000000180067450 poser_turveytori.obj + 0003:0000845c PoserTurveyTori$rtcName$2 000000018006745c poser_turveytori.obj + 0003:00008464 PoserTurveyTori$rtcName$3 0000000180067464 poser_turveytori.obj + 0003:0000846c PoserTurveyTori$rtcName$4 000000018006746c poser_turveytori.obj + 0003:00008474 PoserTurveyTori$rtcName$7 0000000180067474 poser_turveytori.obj + 0003:0000847c PoserTurveyTori$rtcName$8 000000018006747c poser_turveytori.obj + 0003:00008480 PoserTurveyTori$rtcName$5 0000000180067480 poser_turveytori.obj + 0003:00008490 PoserTurveyTori$rtcName$6 0000000180067490 poser_turveytori.obj + 0003:00008498 PoserTurveyTori$rtcName$9 0000000180067498 poser_turveytori.obj + 0003:000084a0 PoserTurveyTori$rtcName$10 00000001800674a0 poser_turveytori.obj + 0003:000084a8 PoserTurveyTori$rtcName$11 00000001800674a8 poser_turveytori.obj + 0003:000084b0 PoserTurveyTori$rtcName$12 00000001800674b0 poser_turveytori.obj + 0003:000084b4 PoserTurveyTori$rtcName$13 00000001800674b4 poser_turveytori.obj + 0003:000084c0 PoserTurveyTori$rtcVarDesc 00000001800674c0 poser_turveytori.obj + 0003:00008840 PoserTurveyTori$rtcFrameData 0000000180067840 poser_turveytori.obj + 0003:00008c00 survive_startup$rtcName$0 0000000180067c00 survive.obj + 0003:00008c08 survive_startup$rtcName$1 0000000180067c08 survive.obj + 0003:00008c10 survive_startup$rtcName$2 0000000180067c10 survive.obj + 0003:00008c18 survive_startup$rtcName$3 0000000180067c18 survive.obj + 0003:00008c20 survive_startup$rtcName$4 0000000180067c20 survive.obj + 0003:00008c28 survive_startup$rtcFrameData 0000000180067c28 survive.obj + 0003:00008c40 survive_startup$rtcVarDesc 0000000180067c40 survive.obj + 0003:00008dd0 survive_close$rtcName$0 0000000180067dd0 survive.obj + 0003:00008dd8 survive_close$rtcName$1 0000000180067dd8 survive.obj + 0003:00008de0 survive_close$rtcName$2 0000000180067de0 survive.obj + 0003:00008de8 survive_close$rtcFrameData 0000000180067de8 survive.obj + 0003:00008e00 survive_close$rtcVarDesc 0000000180067e00 survive.obj + 0003:00008ef0 survive_simple_inflate$rtcName$0 0000000180067ef0 survive.obj + 0003:00008ef4 survive_simple_inflate$rtcName$1 0000000180067ef4 survive.obj + 0003:00008ef8 survive_simple_inflate$rtcName$2 0000000180067ef8 survive.obj + 0003:00008f00 survive_simple_inflate$rtcVarDesc 0000000180067f00 survive.obj + 0003:00008fc0 survive_simple_inflate$rtcFrameData 0000000180067fc0 survive.obj + 0003:00009000 GetDriverByConfig$rtcName$0 0000000180068000 survive.obj + 0003:00009008 GetDriverByConfig$rtcName$1 0000000180068008 survive.obj + 0003:00009010 GetDriverByConfig$rtcName$2 0000000180068010 survive.obj + 0003:00009018 GetDriverByConfig$rtcName$3 0000000180068018 survive.obj + 0003:00009020 GetDriverByConfig$rtcName$4 0000000180068020 survive.obj + 0003:00009028 GetDriverByConfig$rtcFrameData 0000000180068028 survive.obj + 0003:00009040 GetDriverByConfig$rtcVarDesc 0000000180068040 survive.obj + 0003:000099b0 snprintf$rtcName$0 00000001800689b0 survive_cal.obj + 0003:000099c0 snprintf$rtcVarDesc 00000001800689c0 survive_cal.obj + 0003:00009a00 snprintf$rtcFrameData 0000000180068a00 survive_cal.obj + 0003:00009a30 survive_cal_install$rtcName$0 0000000180068a30 survive_cal.obj + 0003:00009a38 survive_cal_install$rtcName$1 0000000180068a38 survive_cal.obj + 0003:00009a40 survive_cal_install$rtcName$2 0000000180068a40 survive_cal.obj + 0003:00009a48 survive_cal_install$rtcName$3 0000000180068a48 survive_cal.obj + 0003:00009a50 survive_cal_install$rtcVarDesc 0000000180068a50 survive_cal.obj + 0003:00009b50 survive_cal_install$rtcFrameData 0000000180068b50 survive_cal.obj + 0003:00009ba0 survive_cal_angle$rtcName$0 0000000180068ba0 survive_cal.obj + 0003:00009ba8 survive_cal_angle$rtcName$1 0000000180068ba8 survive_cal.obj + 0003:00009bb0 survive_cal_angle$rtcName$2 0000000180068bb0 survive_cal.obj + 0003:00009bb8 survive_cal_angle$rtcFrameData 0000000180068bb8 survive_cal.obj + 0003:00009bd0 survive_cal_angle$rtcVarDesc 0000000180068bd0 survive_cal.obj + 0003:00009cc0 handle_calibration$rtcName$0 0000000180068cc0 survive_cal.obj + 0003:00009ccc handle_calibration$rtcName$1 0000000180068ccc survive_cal.obj + 0003:00009cd4 handle_calibration$rtcName$2 0000000180068cd4 survive_cal.obj + 0003:00009cdc handle_calibration$rtcName$3 0000000180068cdc survive_cal.obj + 0003:00009ce4 handle_calibration$rtcName$4 0000000180068ce4 survive_cal.obj + 0003:00009ce8 handle_calibration$rtcName$5 0000000180068ce8 survive_cal.obj + 0003:00009cf0 handle_calibration$rtcName$6 0000000180068cf0 survive_cal.obj + 0003:00009cfc handle_calibration$rtcName$7 0000000180068cfc survive_cal.obj + 0003:00009d04 handle_calibration$rtcName$8 0000000180068d04 survive_cal.obj + 0003:00009d10 handle_calibration$rtcVarDesc 0000000180068d10 survive_cal.obj + 0003:00009f50 handle_calibration$rtcFrameData 0000000180068f50 survive_cal.obj + 0003:00009ff0 ootx_packet_clbk_d$rtcName$0 0000000180068ff0 survive_cal.obj + 0003:00009ff8 ootx_packet_clbk_d$rtcName$1 0000000180068ff8 survive_cal.obj + 0003:0000a000 ootx_packet_clbk_d$rtcVarDesc 0000000180069000 survive_cal.obj + 0003:0000a080 ootx_packet_clbk_d$rtcFrameData 0000000180069080 survive_cal.obj + 0003:0000a5e0 HandleOOTX$rtcName$0 00000001800695e0 survive_charlesbiguator.obj + 0003:0000a5f0 HandleOOTX$rtcVarDesc 00000001800695f0 survive_charlesbiguator.obj + 0003:0000a630 HandleOOTX$rtcFrameData 0000000180069630 survive_charlesbiguator.obj + 0003:0000a660 DisambiguatorCharles$rtcName$0 0000000180069660 survive_charlesbiguator.obj + 0003:0000a668 DisambiguatorCharles$rtcName$1 0000000180069668 survive_charlesbiguator.obj + 0003:0000a670 DisambiguatorCharles$rtcVarDesc 0000000180069670 survive_charlesbiguator.obj + 0003:0000a6f0 DisambiguatorCharles$rtcFrameData 00000001800696f0 survive_charlesbiguator.obj + 0003:0000a7e0 config_read_lighthouse$rtcName$0 00000001800697e0 survive_config.obj + 0003:0000a7f0 config_read_lighthouse$rtcVarDesc 00000001800697f0 survive_config.obj + 0003:0000a830 config_read_lighthouse$rtcFrameData 0000000180069830 survive_config.obj + 0003:0000a860 parse_floats$rtcName$0 0000000180069860 survive_config.obj + 0003:0000a868 parse_floats$rtcName$1 0000000180069868 survive_config.obj + 0003:0000a880 parse_floats$rtcVarDesc 0000000180069880 survive_config.obj + 0003:0000a900 parse_floats$rtcFrameData 0000000180069900 survive_config.obj + 0003:0000a940 parse_uint32$rtcName$0 0000000180069940 survive_config.obj + 0003:0000a948 parse_uint32$rtcName$1 0000000180069948 survive_config.obj + 0003:0000a960 parse_uint32$rtcVarDesc 0000000180069960 survive_config.obj + 0003:0000a9e0 parse_uint32$rtcFrameData 00000001800699e0 survive_config.obj + 0003:0000ab70 survive_load_htc_config_format$rtcName$0 0000000180069b70 survive_default_devices.obj + 0003:0000ab74 survive_load_htc_config_format$rtcName$1 0000000180069b74 survive_default_devices.obj + 0003:0000ab78 survive_load_htc_config_format$rtcName$2 0000000180069b78 survive_default_devices.obj + 0003:0000ab80 survive_load_htc_config_format$rtcName$3 0000000180069b80 survive_default_devices.obj + 0003:0000ab88 survive_load_htc_config_format$rtcName$4 0000000180069b88 survive_default_devices.obj + 0003:0000ab90 survive_load_htc_config_format$rtcName$5 0000000180069b90 survive_default_devices.obj + 0003:0000ab98 survive_load_htc_config_format$rtcName$6 0000000180069b98 survive_default_devices.obj + 0003:0000aba0 survive_load_htc_config_format$rtcName$7 0000000180069ba0 survive_default_devices.obj + 0003:0000aba8 survive_load_htc_config_format$rtcName$8 0000000180069ba8 survive_default_devices.obj + 0003:0000abb0 survive_load_htc_config_format$rtcName$9 0000000180069bb0 survive_default_devices.obj + 0003:0000abb8 survive_load_htc_config_format$rtcFrameData 0000000180069bb8 survive_default_devices.obj + 0003:0000abd0 survive_load_htc_config_format$rtcVarDesc 0000000180069bd0 survive_default_devices.obj + 0003:0000aef0 ParsePoints$rtcName$0 0000000180069ef0 survive_default_devices.obj + 0003:0000aef4 ParsePoints$rtcName$1 0000000180069ef4 survive_default_devices.obj + 0003:0000af00 ParsePoints$rtcVarDesc 0000000180069f00 survive_default_devices.obj + 0003:0000af80 ParsePoints$rtcFrameData 0000000180069f80 survive_default_devices.obj + 0003:0000b120 sscanf$rtcName$0 000000018006a120 survive_playback.obj + 0003:0000b130 sscanf$rtcVarDesc 000000018006a130 survive_playback.obj + 0003:0000b170 sscanf$rtcFrameData 000000018006a170 survive_playback.obj + 0003:0000b1a0 write_to_output$rtcName$0 000000018006a1a0 survive_playback.obj + 0003:0000b1a8 write_to_output$rtcName$1 000000018006a1a8 survive_playback.obj + 0003:0000b1b0 write_to_output$rtcVarDesc 000000018006a1b0 survive_playback.obj + 0003:0000b230 write_to_output$rtcFrameData 000000018006a230 survive_playback.obj + 0003:0000b260 parse_and_run_imu$rtcName$0 000000018006a260 survive_playback.obj + 0003:0000b264 parse_and_run_imu$rtcName$4 000000018006a264 survive_playback.obj + 0003:0000b268 parse_and_run_imu$rtcName$1 000000018006a268 survive_playback.obj + 0003:0000b278 parse_and_run_imu$rtcName$2 000000018006a278 survive_playback.obj + 0003:0000b284 parse_and_run_imu$rtcName$3 000000018006a284 survive_playback.obj + 0003:0000b28c parse_and_run_imu$rtcName$5 000000018006a28c survive_playback.obj + 0003:0000b298 parse_and_run_imu$rtcFrameData 000000018006a298 survive_playback.obj + 0003:0000b2b0 parse_and_run_imu$rtcVarDesc 000000018006a2b0 survive_playback.obj + 0003:0000b490 parse_and_run_rawlight$rtcName$0 000000018006a490 survive_playback.obj + 0003:0000b494 parse_and_run_rawlight$rtcName$1 000000018006a494 survive_playback.obj + 0003:0000b498 parse_and_run_rawlight$rtcName$2 000000018006a498 survive_playback.obj + 0003:0000b49c parse_and_run_rawlight$rtcName$3 000000018006a49c survive_playback.obj + 0003:0000b4a8 parse_and_run_rawlight$rtcFrameData 000000018006a4a8 survive_playback.obj + 0003:0000b4c0 parse_and_run_rawlight$rtcVarDesc 000000018006a4c0 survive_playback.obj + 0003:0000b600 parse_and_run_lightcode$rtcName$0 000000018006a600 survive_playback.obj + 0003:0000b604 parse_and_run_lightcode$rtcName$1 000000018006a604 survive_playback.obj + 0003:0000b608 parse_and_run_lightcode$rtcName$2 000000018006a608 survive_playback.obj + 0003:0000b60c parse_and_run_lightcode$rtcName$8 000000018006a60c survive_playback.obj + 0003:0000b610 parse_and_run_lightcode$rtcName$3 000000018006a610 survive_playback.obj + 0003:0000b61c parse_and_run_lightcode$rtcName$5 000000018006a61c survive_playback.obj + 0003:0000b628 parse_and_run_lightcode$rtcName$4 000000018006a628 survive_playback.obj + 0003:0000b638 parse_and_run_lightcode$rtcName$6 000000018006a638 survive_playback.obj + 0003:0000b644 parse_and_run_lightcode$rtcName$7 000000018006a644 survive_playback.obj + 0003:0000b64c parse_and_run_lightcode$rtcName$9 000000018006a64c survive_playback.obj + 0003:0000b658 parse_and_run_lightcode$rtcFrameData 000000018006a658 survive_playback.obj + 0003:0000b670 parse_and_run_lightcode$rtcVarDesc 000000018006a670 survive_playback.obj + 0003:0000b990 playback_poll$rtcName$0 000000018006a990 survive_playback.obj + 0003:0000b998 playback_poll$rtcName$1 000000018006a998 survive_playback.obj + 0003:0000b99c playback_poll$rtcName$2 000000018006a99c survive_playback.obj + 0003:0000b9a0 playback_poll$rtcName$3 000000018006a9a0 survive_playback.obj + 0003:0000b9a4 playback_poll$rtcName$4 000000018006a9a4 survive_playback.obj + 0003:0000b9a8 playback_poll$rtcFrameData 000000018006a9a8 survive_playback.obj + 0003:0000b9c0 playback_poll$rtcVarDesc 000000018006a9c0 survive_playback.obj + 0003:0000bb50 survive_install_recording$rtcName$0 000000018006ab50 survive_playback.obj + 0003:0000bb58 survive_install_recording$rtcName$1 000000018006ab58 survive_playback.obj + 0003:0000bb60 survive_install_recording$rtcName$2 000000018006ab60 survive_playback.obj + 0003:0000bb68 survive_install_recording$rtcFrameData 000000018006ab68 survive_playback.obj + 0003:0000bb80 survive_install_recording$rtcVarDesc 000000018006ab80 survive_playback.obj + 0003:0000bc70 DriverRegPlayback$rtcName$0 000000018006ac70 survive_playback.obj + 0003:0000bc78 DriverRegPlayback$rtcName$1 000000018006ac78 survive_playback.obj + 0003:0000bc80 DriverRegPlayback$rtcName$2 000000018006ac80 survive_playback.obj + 0003:0000bc88 DriverRegPlayback$rtcName$3 000000018006ac88 survive_playback.obj + 0003:0000bc90 DriverRegPlayback$rtcName$4 000000018006ac90 survive_playback.obj + 0003:0000bc94 DriverRegPlayback$rtcName$5 000000018006ac94 survive_playback.obj + 0003:0000bc98 DriverRegPlayback$rtcName$6 000000018006ac98 survive_playback.obj + 0003:0000bca0 DriverRegPlayback$rtcName$7 000000018006aca0 survive_playback.obj + 0003:0000bca8 DriverRegPlayback$rtcFrameData 000000018006aca8 survive_playback.obj + 0003:0000bcc0 DriverRegPlayback$rtcVarDesc 000000018006acc0 survive_playback.obj + 0003:0000c340 survive_default_light_process$rtcName$0 000000018006b340 survive_process.obj + 0003:0000c350 survive_default_light_process$rtcVarDesc 000000018006b350 survive_process.obj + 0003:0000c390 survive_default_light_process$rtcFrameData 000000018006b390 survive_process.obj + 0003:0000c3c0 survive_default_imu_process$rtcName$0 000000018006b3c0 survive_process.obj + 0003:0000c3d0 survive_default_imu_process$rtcVarDesc 000000018006b3d0 survive_process.obj + 0003:0000c410 survive_default_imu_process$rtcFrameData 000000018006b410 survive_process.obj + 0003:0000c440 survive_default_angle_process$rtcName$0 000000018006b440 survive_process.obj + 0003:0000c450 survive_default_angle_process$rtcVarDesc 000000018006b450 survive_process.obj + 0003:0000c490 survive_default_angle_process$rtcFrameData 000000018006b490 survive_process.obj + 0003:0000c4d0 survive_calibration_options_config_apply$rtcName$0 000000018006b4d0 survive_reproject.obj + 0003:0000c4e0 survive_calibration_options_config_apply$rtcVarDesc 000000018006b4e0 survive_reproject.obj + 0003:0000c520 survive_calibration_options_config_apply$rtcFrameData 000000018006b520 survive_reproject.obj + 0003:0000c550 survive_calibration_config_max_idx$rtcName$0 000000018006b550 survive_reproject.obj + 0003:0000c560 survive_calibration_config_max_idx$rtcVarDesc 000000018006b560 survive_reproject.obj + 0003:0000c5a0 survive_calibration_config_max_idx$rtcFrameData 000000018006b5a0 survive_reproject.obj + 0003:0000c5d0 survive_calibration_config_create_from_idx$rtcName$0 000000018006b5d0 survive_reproject.obj + 0003:0000c5e0 survive_calibration_config_create_from_idx$rtcVarDesc 000000018006b5e0 survive_reproject.obj + 0003:0000c620 survive_calibration_config_create_from_idx$rtcFrameData 000000018006b620 survive_reproject.obj + 0003:0000c650 survive_reproject_from_pose_with_config$rtcName$0 000000018006b650 survive_reproject.obj + 0003:0000c658 survive_reproject_from_pose_with_config$rtcName$1 000000018006b658 survive_reproject.obj + 0003:0000c660 survive_reproject_from_pose_with_config$rtcName$2 000000018006b660 survive_reproject.obj + 0003:0000c668 survive_reproject_from_pose_with_config$rtcName$3 000000018006b668 survive_reproject.obj + 0003:0000c670 survive_reproject_from_pose_with_config$rtcName$4 000000018006b670 survive_reproject.obj + 0003:0000c678 survive_reproject_from_pose_with_config$rtcName$5 000000018006b678 survive_reproject.obj + 0003:0000c680 survive_reproject_from_pose_with_config$rtcName$6 000000018006b680 survive_reproject.obj + 0003:0000c68c survive_reproject_from_pose_with_config$rtcName$7 000000018006b68c survive_reproject.obj + 0003:0000c698 survive_reproject_from_pose_with_config$rtcFrameData 000000018006b698 survive_reproject.obj + 0003:0000c6b0 survive_reproject_from_pose_with_config$rtcVarDesc 000000018006b6b0 survive_reproject.obj + 0003:0000c930 tau_table 000000018006b930 survive_turveybiguator.obj + 0003:0000cb50 wprintf$rtcName$0 000000018006bb50 survive_vive.obj + 0003:0000cb60 wprintf$rtcVarDesc 000000018006bb60 survive_vive.obj + 0003:0000cba0 wprintf$rtcFrameData 000000018006bba0 survive_vive.obj + 0003:0000cbd0 survive_data_cb$rtcName$0 000000018006bbd0 survive_vive.obj + 0003:0000cbd4 survive_data_cb$rtcName$1 000000018006bbd4 survive_vive.obj + 0003:0000cbdc survive_data_cb$rtcName$2 000000018006bbdc survive_vive.obj + 0003:0000cbe0 survive_data_cb$rtcName$3 000000018006bbe0 survive_vive.obj + 0003:0000cbe4 survive_data_cb$rtcName$4 000000018006bbe4 survive_vive.obj + 0003:0000cbf0 survive_data_cb$rtcVarDesc 000000018006bbf0 survive_vive.obj + 0003:0000cd30 survive_data_cb$rtcFrameData 000000018006bd30 survive_vive.obj + 0003:0000cd90 survive_usb_init$rtcName$0 000000018006bd90 survive_vive.obj + 0003:0000cd98 survive_usb_init$rtcName$1 000000018006bd98 survive_vive.obj + 0003:0000cda0 survive_usb_init$rtcName$2 000000018006bda0 survive_vive.obj + 0003:0000cda8 survive_usb_init$rtcName$3 000000018006bda8 survive_vive.obj + 0003:0000cdb0 survive_usb_init$rtcName$4 000000018006bdb0 survive_vive.obj + 0003:0000cdb8 survive_usb_init$rtcFrameData 000000018006bdb8 survive_vive.obj + 0003:0000cdd0 survive_usb_init$rtcVarDesc 000000018006bdd0 survive_vive.obj + 0003:0000cf60 survive_get_config$rtcName$0 000000018006bf60 survive_vive.obj + 0003:0000cf68 survive_get_config$rtcName$1 000000018006bf68 survive_vive.obj + 0003:0000cf78 survive_get_config$rtcName$2 000000018006bf78 survive_vive.obj + 0003:0000cf90 survive_get_config$rtcName$3 000000018006bf90 survive_vive.obj + 0003:0000cfa0 survive_get_config$rtcName$4 000000018006bfa0 survive_vive.obj + 0003:0000cfb0 survive_get_config$rtcName$5 000000018006bfb0 survive_vive.obj + 0003:0000cfb8 survive_get_config$rtcName$6 000000018006bfb8 survive_vive.obj + 0003:0000cfc0 survive_get_config$rtcName$7 000000018006bfc0 survive_vive.obj + 0003:0000cfc8 survive_get_config$rtcName$8 000000018006bfc8 survive_vive.obj + 0003:0000cfd0 survive_get_config$rtcName$9 000000018006bfd0 survive_vive.obj + 0003:0000cfd8 survive_get_config$rtcName$10 000000018006bfd8 survive_vive.obj + 0003:0000cfe0 survive_get_config$rtcName$11 000000018006bfe0 survive_vive.obj + 0003:0000cfe8 survive_get_config$rtcName$12 000000018006bfe8 survive_vive.obj + 0003:0000cff0 survive_get_config$rtcVarDesc 000000018006bff0 survive_vive.obj + 0003:0000d330 survive_get_config$rtcFrameData 000000018006c330 survive_vive.obj + 0003:0000d410 survive_vive_send_magic$rtcName$0 000000018006c410 survive_vive.obj + 0003:0000d418 survive_vive_send_magic$rtcName$1 000000018006c418 survive_vive.obj + 0003:0000d420 survive_vive_send_magic$rtcVarDesc 000000018006c420 survive_vive.obj + 0003:0000d4a0 survive_vive_send_magic$rtcFrameData 000000018006c4a0 survive_vive.obj + 0003:0000d4d0 survive_vive_send_haptic$rtcName$0 000000018006c4d0 survive_vive.obj + 0003:0000d4f0 survive_vive_send_haptic$rtcName$1 000000018006c4f0 survive_vive.obj + 0003:0000d500 survive_vive_send_haptic$rtcVarDesc 000000018006c500 survive_vive.obj + 0003:0000d580 survive_vive_send_haptic$rtcFrameData 000000018006c580 survive_vive.obj + 0003:0000d5c0 handle_watchman$rtcName$0 000000018006c5c0 survive_vive.obj + 0003:0000d5cc handle_watchman$rtcName$1 000000018006c5cc survive_vive.obj + 0003:0000d5d4 handle_watchman$rtcName$2 000000018006c5d4 survive_vive.obj + 0003:0000d5d8 handle_watchman$rtcName$3 000000018006c5d8 survive_vive.obj + 0003:0000d5e0 handle_watchman$rtcName$4 000000018006c5e0 survive_vive.obj + 0003:0000d5e4 handle_watchman$rtcName$5 000000018006c5e4 survive_vive.obj + 0003:0000d5e8 handle_watchman$rtcName$6 000000018006c5e8 survive_vive.obj + 0003:0000d5f0 handle_watchman$rtcName$7 000000018006c5f0 survive_vive.obj + 0003:0000d600 handle_watchman$rtcVarDesc 000000018006c600 survive_vive.obj + 0003:0000d800 handle_watchman$rtcFrameData 000000018006c800 survive_vive.obj + 0003:0000d890 LoadConfig$rtcName$0 000000018006c890 survive_vive.obj + 0003:0000d898 LoadConfig$rtcName$1 000000018006c898 survive_vive.obj + 0003:0000d8a0 LoadConfig$rtcName$2 000000018006c8a0 survive_vive.obj + 0003:0000d8b0 LoadConfig$rtcVarDesc 000000018006c8b0 survive_vive.obj + 0003:0000d970 LoadConfig$rtcFrameData 000000018006c970 survive_vive.obj + 0003:0000d9b0 DriverRegHTCVive$rtcName$0 000000018006c9b0 survive_vive.obj + 0003:0000d9b8 DriverRegHTCVive$rtcName$1 000000018006c9b8 survive_vive.obj + 0003:0000d9c0 DriverRegHTCVive$rtcName$2 000000018006c9c0 survive_vive.obj + 0003:0000d9c8 DriverRegHTCVive$rtcName$3 000000018006c9c8 survive_vive.obj + 0003:0000d9d0 DriverRegHTCVive$rtcName$4 000000018006c9d0 survive_vive.obj + 0003:0000d9d8 DriverRegHTCVive$rtcName$5 000000018006c9d8 survive_vive.obj + 0003:0000d9e0 DriverRegHTCVive$rtcName$6 000000018006c9e0 survive_vive.obj + 0003:0000d9e8 DriverRegHTCVive$rtcFrameData 000000018006c9e8 survive_vive.obj + 0003:0000da00 DriverRegHTCVive$rtcVarDesc 000000018006ca00 survive_vive.obj + 0003:0000e1f8 GS_ExceptionPointers 000000018006d1f8 MSVCRTD:gs_report.obj + 0003:0000e220 ?_RTC_errlist@@3QBQEBDB 000000018006d220 MSVCRTD:_userapi_.obj + 0003:0000e328 ?_RTC_ErrorMessages@@3QBQEBDB 000000018006d328 MSVCRTD:_error_.obj + 0003:0000e358 ?_RTC_NoFalsePositives@@3QBHB 000000018006d358 MSVCRTD:_error_.obj + 0003:0000e370 ?stack_premsg@@3QBDB 000000018006d370 MSVCRTD:_error_.obj + 0003:0000e390 ?stack_postmsg@@3QBDB 000000018006d390 MSVCRTD:_error_.obj + 0003:0000e3a8 ?uninit_premsg@@3QBDB 000000018006d3a8 MSVCRTD:_error_.obj + 0003:0000e3b8 ?uninit_postmsg@@3QBDB 000000018006d3b8 MSVCRTD:_error_.obj + 0003:0000ea38 ?mspdbName@@3QB_WB 000000018006da38 MSVCRTD:_pdblkup_.obj + 0003:0000ea68 ?debugCrtFileName@@3QB_WB 000000018006da68 MSVCRTD:_pdblkup_.obj + 0003:0000ec00 ?dllExt@?1??GetPdbDllPathFromFilePath@@YAHPEB_WPEA_W_K@Z@4QB_WB 000000018006dc00 MSVCRTD:_pdblkup_.obj + 0003:0000ec10 ?mspdbFilename@?1??GetPdbDllPathFromFilePath@@YAHPEB_WPEA_W_K@Z@4QB_WB 000000018006dc10 MSVCRTD:_pdblkup_.obj + 0003:0000f418 _RTC_InitBase.rtc$IMZ 000000018006e418 crc32.obj + 0003:0000f428 _RTC_InitBase.rtc$IMZ 000000018006e428 hid-windows.obj + 0003:0000f438 _RTC_InitBase.rtc$IMZ 000000018006e438 jsmn.obj + 0003:0000f448 _RTC_InitBase.rtc$IMZ 000000018006e448 json_helpers.obj + 0003:0000f458 _RTC_InitBase.rtc$IMZ 000000018006e458 linmath.obj + 0003:0000f468 _RTC_InitBase.rtc$IMZ 000000018006e468 os_generic.obj + 0003:0000f478 _RTC_InitBase.rtc$IMZ 000000018006e478 puff.obj + 0003:0000f488 _RTC_InitBase.rtc$IMZ 000000018006e488 symbol_enumerator.obj + 0003:0000f498 _RTC_InitBase.rtc$IMZ 000000018006e498 ootx_decoder.obj + 0003:0000f4a8 _RTC_InitBase.rtc$IMZ 000000018006e4a8 poser.obj + 0003:0000f4b8 _RTC_InitBase.rtc$IMZ 000000018006e4b8 poser_charlesslow.obj + 0003:0000f4c8 _RTC_InitBase.rtc$IMZ 000000018006e4c8 poser_daveortho.obj + 0003:0000f4d8 _RTC_InitBase.rtc$IMZ 000000018006e4d8 poser_dummy.obj + 0003:0000f4e8 _RTC_InitBase.rtc$IMZ 000000018006e4e8 poser_octavioradii.obj + 0003:0000f4f8 _RTC_InitBase.rtc$IMZ 000000018006e4f8 poser_turveytori.obj + 0003:0000f508 _RTC_InitBase.rtc$IMZ 000000018006e508 survive.obj + 0003:0000f518 _RTC_InitBase.rtc$IMZ 000000018006e518 survive_cal.obj + 0003:0000f528 _RTC_InitBase.rtc$IMZ 000000018006e528 survive_charlesbiguator.obj + 0003:0000f538 _RTC_InitBase.rtc$IMZ 000000018006e538 survive_config.obj + 0003:0000f548 _RTC_InitBase.rtc$IMZ 000000018006e548 survive_default_devices.obj + 0003:0000f558 _RTC_InitBase.rtc$IMZ 000000018006e558 survive_disambiguator.obj + 0003:0000f568 _RTC_InitBase.rtc$IMZ 000000018006e568 survive_driverman.obj + 0003:0000f578 _RTC_InitBase.rtc$IMZ 000000018006e578 survive_playback.obj + 0003:0000f588 _RTC_InitBase.rtc$IMZ 000000018006e588 survive_process.obj + 0003:0000f598 _RTC_InitBase.rtc$IMZ 000000018006e598 survive_reproject.obj + 0003:0000f5a8 _RTC_InitBase.rtc$IMZ 000000018006e5a8 survive_sensor_activations.obj + 0003:0000f5b8 _RTC_InitBase.rtc$IMZ 000000018006e5b8 survive_turveybiguator.obj + 0003:0000f5c8 _RTC_InitBase.rtc$IMZ 000000018006e5c8 survive_vive.obj + 0003:0000f5d8 _RTC_InitBase.rtc$IMZ 000000018006e5d8 getdelim.obj + 0003:0000f940 _RTC_Shutdown.rtc$TMZ 000000018006e940 crc32.obj + 0003:0000f950 _RTC_Shutdown.rtc$TMZ 000000018006e950 hid-windows.obj + 0003:0000f960 _RTC_Shutdown.rtc$TMZ 000000018006e960 jsmn.obj + 0003:0000f970 _RTC_Shutdown.rtc$TMZ 000000018006e970 json_helpers.obj + 0003:0000f980 _RTC_Shutdown.rtc$TMZ 000000018006e980 linmath.obj + 0003:0000f990 _RTC_Shutdown.rtc$TMZ 000000018006e990 os_generic.obj + 0003:0000f9a0 _RTC_Shutdown.rtc$TMZ 000000018006e9a0 puff.obj + 0003:0000f9b0 _RTC_Shutdown.rtc$TMZ 000000018006e9b0 symbol_enumerator.obj + 0003:0000f9c0 _RTC_Shutdown.rtc$TMZ 000000018006e9c0 ootx_decoder.obj + 0003:0000f9d0 _RTC_Shutdown.rtc$TMZ 000000018006e9d0 poser.obj + 0003:0000f9e0 _RTC_Shutdown.rtc$TMZ 000000018006e9e0 poser_charlesslow.obj + 0003:0000f9f0 _RTC_Shutdown.rtc$TMZ 000000018006e9f0 poser_daveortho.obj + 0003:0000fa00 _RTC_Shutdown.rtc$TMZ 000000018006ea00 poser_dummy.obj + 0003:0000fa10 _RTC_Shutdown.rtc$TMZ 000000018006ea10 poser_octavioradii.obj + 0003:0000fa20 _RTC_Shutdown.rtc$TMZ 000000018006ea20 poser_turveytori.obj + 0003:0000fa30 _RTC_Shutdown.rtc$TMZ 000000018006ea30 survive.obj + 0003:0000fa40 _RTC_Shutdown.rtc$TMZ 000000018006ea40 survive_cal.obj + 0003:0000fa50 _RTC_Shutdown.rtc$TMZ 000000018006ea50 survive_charlesbiguator.obj + 0003:0000fa60 _RTC_Shutdown.rtc$TMZ 000000018006ea60 survive_config.obj + 0003:0000fa70 _RTC_Shutdown.rtc$TMZ 000000018006ea70 survive_default_devices.obj + 0003:0000fa80 _RTC_Shutdown.rtc$TMZ 000000018006ea80 survive_disambiguator.obj + 0003:0000fa90 _RTC_Shutdown.rtc$TMZ 000000018006ea90 survive_driverman.obj + 0003:0000faa0 _RTC_Shutdown.rtc$TMZ 000000018006eaa0 survive_playback.obj + 0003:0000fab0 _RTC_Shutdown.rtc$TMZ 000000018006eab0 survive_process.obj + 0003:0000fac0 _RTC_Shutdown.rtc$TMZ 000000018006eac0 survive_reproject.obj + 0003:0000fad0 _RTC_Shutdown.rtc$TMZ 000000018006ead0 survive_sensor_activations.obj + 0003:0000fae0 _RTC_Shutdown.rtc$TMZ 000000018006eae0 survive_turveybiguator.obj + 0003:0000faf0 _RTC_Shutdown.rtc$TMZ 000000018006eaf0 survive_vive.obj + 0003:0000fb00 _RTC_Shutdown.rtc$TMZ 000000018006eb00 getdelim.obj + 0003:0000fd58 $unwind$crc32 000000018006ed58 crc32.obj + 0003:0000fd6c $unwind$hid_init 000000018006ed6c hid-windows.obj + 0003:0000fd80 $unwind$hid_exit 000000018006ed80 hid-windows.obj + 0003:0000fd94 $unwind$hid_enumerate 000000018006ed94 hid-windows.obj + 0003:0000fdb0 $unwind$hid_free_enumeration 000000018006edb0 hid-windows.obj + 0003:0000fdc4 $unwind$hid_open 000000018006edc4 hid-windows.obj + 0003:0000fdd8 $unwind$hid_open_path 000000018006edd8 hid-windows.obj + 0003:0000fdf4 $unwind$hid_write 000000018006edf4 hid-windows.obj + 0003:0000fe08 $unwind$hid_read_timeout 000000018006ee08 hid-windows.obj + 0003:0000fe1c $unwind$hid_read 000000018006ee1c hid-windows.obj + 0003:0000fe30 $unwind$hid_set_nonblocking 000000018006ee30 hid-windows.obj + 0003:0000fe44 $unwind$hid_send_feature_report 000000018006ee44 hid-windows.obj + 0003:0000fe58 $unwind$hid_get_feature_report 000000018006ee58 hid-windows.obj + 0003:0000fe6c $unwind$hid_close 000000018006ee6c hid-windows.obj + 0003:0000fe80 $unwind$hid_get_manufacturer_string 000000018006ee80 hid-windows.obj + 0003:0000fe94 $unwind$hid_get_product_string 000000018006ee94 hid-windows.obj + 0003:0000fea8 $unwind$hid_get_serial_number_string 000000018006eea8 hid-windows.obj + 0003:0000febc $unwind$hid_get_indexed_string 000000018006eebc hid-windows.obj + 0003:0000fed0 $unwind$hid_error 000000018006eed0 hid-windows.obj + 0003:0000fee4 $unwind$new_hid_device 000000018006eee4 hid-windows.obj + 0003:0000fef8 $unwind$free_hid_device 000000018006eef8 hid-windows.obj + 0003:0000ff0c $unwind$register_error 000000018006ef0c hid-windows.obj + 0003:0000ff20 $unwind$lookup_functions 000000018006ef20 hid-windows.obj + 0003:0000ff34 $unwind$open_device 000000018006ef34 hid-windows.obj + 0003:0000ff48 $unwind$jsmn_init 000000018006ef48 jsmn.obj + 0003:0000ff5c $unwind$jsmn_parse 000000018006ef5c jsmn.obj + 0003:0000ff70 $unwind$jsmn_alloc_token 000000018006ef70 jsmn.obj + 0003:0000ff84 $unwind$jsmn_fill_token 000000018006ef84 jsmn.obj + 0003:0000ff98 $unwind$jsmn_parse_primitive 000000018006ef98 jsmn.obj + 0003:0000ffac $unwind$jsmn_parse_string 000000018006efac jsmn.obj + 0003:0000ffc0 $unwind$__local_stdio_printf_options 000000018006efc0 json_helpers.obj + 0003:0000ffd4 $unwind$_vfprintf_l 000000018006efd4 json_helpers.obj + 0003:0000ffe8 $unwind$fprintf 000000018006efe8 json_helpers.obj + 0003:0000fffc $unwind$_vsnprintf_l 000000018006effc json_helpers.obj + 0003:00010010 $unwind$_vsnprintf 000000018006f010 json_helpers.obj + 0003:00010024 $unwind$_vscprintf_l 000000018006f024 json_helpers.obj + 0003:00010038 $unwind$_vscprintf 000000018006f038 json_helpers.obj + 0003:0001004c $unwind$json_write_float_array 000000018006f04c json_helpers.obj + 0003:00010060 $unwind$json_write_double_array 000000018006f060 json_helpers.obj + 0003:00010074 $unwind$json_write_uint32 000000018006f074 json_helpers.obj + 0003:00010088 $unwind$json_write_float 000000018006f088 json_helpers.obj + 0003:0001009c $unwind$json_write_str 000000018006f09c json_helpers.obj + 0003:000100b0 $unwind$parse_float_array 000000018006f0b0 json_helpers.obj + 0003:000100c4 $unwind$json_load_file 000000018006f0c4 json_helpers.obj + 0003:000100e0 $unwind$asprintf 000000018006f0e0 json_helpers.obj + 0003:000100f4 $unwind$load_file_to_mem 000000018006f0f4 json_helpers.obj + 0003:00010108 $unwind$substr 000000018006f108 json_helpers.obj + 0003:0001011c $unwind$json_load_array 000000018006f11c json_helpers.obj + 0003:00010138 $unwind$cross3d 000000018006f138 linmath.obj + 0003:0001014c $unwind$sub3d 000000018006f14c linmath.obj + 0003:00010160 $unwind$add3d 000000018006f160 linmath.obj + 0003:00010174 $unwind$scale3d 000000018006f174 linmath.obj + 0003:00010188 $unwind$normalize3d 000000018006f188 linmath.obj + 0003:0001019c $unwind$dot3d 000000018006f19c linmath.obj + 0003:000101b0 $unwind$compare3d 000000018006f1b0 linmath.obj + 0003:000101c4 $unwind$copy3d 000000018006f1c4 linmath.obj + 0003:000101d8 $unwind$magnitude3d 000000018006f1d8 linmath.obj + 0003:000101ec $unwind$anglebetween3d 000000018006f1ec linmath.obj + 0003:00010208 $unwind$rotatearoundaxis 000000018006f208 linmath.obj + 0003:0001021c $unwind$angleaxisfrom2vect 000000018006f21c linmath.obj + 0003:00010238 $unwind$axisanglefromquat 000000018006f238 linmath.obj + 0003:00010254 $unwind$quatsetnone 000000018006f254 linmath.obj + 0003:00010268 $unwind$quatcopy 000000018006f268 linmath.obj + 0003:0001027c $unwind$quatfromeuler 000000018006f27c linmath.obj + 0003:00010290 $unwind$quattoeuler 000000018006f290 linmath.obj + 0003:000102a4 $unwind$quatfromaxisangle 000000018006f2a4 linmath.obj + 0003:000102c0 $unwind$quatmagnitude 000000018006f2c0 linmath.obj + 0003:000102d4 $unwind$quatinvsqmagnitude 000000018006f2d4 linmath.obj + 0003:000102e8 $unwind$quatnormalize 000000018006f2e8 linmath.obj + 0003:000102fc $unwind$quattomatrix 000000018006f2fc linmath.obj + 0003:00010318 $unwind$quatfrommatrix 000000018006f318 linmath.obj + 0003:0001032c $unwind$quatfrommatrix33 000000018006f32c linmath.obj + 0003:00010340 $unwind$quatgetconjugate 000000018006f340 linmath.obj + 0003:00010354 $unwind$quatgetreciprocal 000000018006f354 linmath.obj + 0003:00010368 $unwind$quatsub 000000018006f368 linmath.obj + 0003:0001037c $unwind$quatadd 000000018006f37c linmath.obj + 0003:00010390 $unwind$quatrotateabout 000000018006f390 linmath.obj + 0003:000103a4 $unwind$quatscale 000000018006f3a4 linmath.obj + 0003:000103b8 $unwind$quatinnerproduct 000000018006f3b8 linmath.obj + 0003:000103cc $unwind$quatouterproduct 000000018006f3cc linmath.obj + 0003:000103e0 $unwind$quatevenproduct 000000018006f3e0 linmath.obj + 0003:000103f4 $unwind$quatoddproduct 000000018006f3f4 linmath.obj + 0003:00010408 $unwind$quatslerp 000000018006f408 linmath.obj + 0003:00010424 $unwind$quatrotatevector 000000018006f424 linmath.obj + 0003:00010440 $unwind$quatfrom2vectors 000000018006f440 linmath.obj + 0003:0001045c $unwind$ApplyPoseToPoint 000000018006f45c linmath.obj + 0003:00010470 $unwind$ApplyPoseToPose 000000018006f470 linmath.obj + 0003:00010484 $unwind$InvertPose 000000018006f484 linmath.obj + 0003:00010498 $unwind$rotate_vec 000000018006f498 linmath.obj + 0003:000104ac $unwind$rotation_between_vecs_to_m3 000000018006f4ac linmath.obj + 0003:000104c8 $unwind$inverseM33 000000018006f4c8 linmath.obj + 0003:000104e4 $unwind$matrix44copy 000000018006f4e4 linmath.obj + 0003:000104f8 $unwind$matrix44transpose 000000018006f4f8 linmath.obj + 0003:0001050c $unwind$quattomatrix33 000000018006f50c linmath.obj + 0003:00010528 $unwind$OGGetAbsoluteTime 000000018006f528 os_generic.obj + 0003:0001053c $unwind$OGSleep 000000018006f53c os_generic.obj + 0003:00010550 $unwind$OGUSleep 000000018006f550 os_generic.obj + 0003:00010564 $unwind$OGGetFileTime 000000018006f564 os_generic.obj + 0003:00010578 $unwind$OGCreateThread 000000018006f578 os_generic.obj + 0003:0001058c $unwind$OGJoinThread 000000018006f58c os_generic.obj + 0003:000105a0 $unwind$OGCancelThread 000000018006f5a0 os_generic.obj + 0003:000105b4 $unwind$OGCreateMutex 000000018006f5b4 os_generic.obj + 0003:000105c8 $unwind$OGLockMutex 000000018006f5c8 os_generic.obj + 0003:000105dc $unwind$OGUnlockMutex 000000018006f5dc os_generic.obj + 0003:000105f0 $unwind$OGDeleteMutex 000000018006f5f0 os_generic.obj + 0003:00010604 $unwind$OGCreateSema 000000018006f604 os_generic.obj + 0003:00010618 $unwind$OGLockSema 000000018006f618 os_generic.obj + 0003:0001062c $unwind$OGGetSema 000000018006f62c os_generic.obj + 0003:00010640 $unwind$OGUnlockSema 000000018006f640 os_generic.obj + 0003:00010654 $unwind$OGDeleteSema 000000018006f654 os_generic.obj + 0003:00010668 $unwind$puff 000000018006f668 puff.obj + 0003:00010684 $unwind$bits 000000018006f684 puff.obj + 0003:00010698 $unwind$stored 000000018006f698 puff.obj + 0003:000106ac $unwind$decode 000000018006f6ac puff.obj + 0003:000106c0 $unwind$construct 000000018006f6c0 puff.obj + 0003:000106dc $unwind$codes 000000018006f6dc puff.obj + 0003:000106f0 $unwind$fixed 000000018006f6f0 puff.obj + 0003:0001070c $unwind$dynamic 000000018006f70c puff.obj + 0003:00010728 $unwind$EnumerateSymbols 000000018006f728 symbol_enumerator.obj + 0003:0001073c $unwind$mycb 000000018006f73c symbol_enumerator.obj + 0003:00010750 $unwind$printf 000000018006f750 ootx_decoder.obj + 0003:00010764 $unwind$init_lighthouse_info_v6 000000018006f764 ootx_decoder.obj + 0003:00010778 $unwind$print_lighthouse_info_v6 000000018006f778 ootx_decoder.obj + 0003:0001079c $unwind$ootx_init_decoder_context 000000018006f79c ootx_decoder.obj + 0003:000107b0 $unwind$ootx_free_decoder_context 000000018006f7b0 ootx_decoder.obj + 0003:000107c4 $unwind$ootx_process_bit 000000018006f7c4 ootx_decoder.obj + 0003:000107d8 $unwind$ootx_pump_bit 000000018006f7d8 ootx_decoder.obj + 0003:000107ec $unwind$ootx_decode_bit 000000018006f7ec ootx_decoder.obj + 0003:00010800 $unwind$ootx_detect_preamble 000000018006f800 ootx_decoder.obj + 0003:00010814 $unwind$ootx_reset_buffer 000000018006f814 ootx_decoder.obj + 0003:00010828 $unwind$ootx_inc_buffer_offset 000000018006f828 ootx_decoder.obj + 0003:0001083c $unwind$ootx_write_to_buffer 000000018006f83c ootx_decoder.obj + 0003:00010850 $unwind$get_ptr 000000018006f850 ootx_decoder.obj + 0003:00010864 $unwind$_half_to_float 000000018006f864 ootx_decoder.obj + 0003:00010878 $unwind$PoserData_poser_raw_pose_func 000000018006f878 poser.obj + 0003:0001088c $unwind$PoserData_lighthouse_pose_func 000000018006f88c poser.obj + 0003:000108a8 $unwind$_vsprintf_l 000000018006f8a8 poser_charlesslow.obj + 0003:000108bc $unwind$sprintf 000000018006f8bc poser_charlesslow.obj + 0003:000108d0 $unwind$RunOpti 000000018006f8d0 poser_charlesslow.obj + 0003:000108ec $unwind$PoserCharlesSlow 000000018006f8ec poser_charlesslow.obj + 0003:00010908 $unwind$REGISTERPoserCharlesSlow 000000018006f908 poser_charlesslow.obj + 0003:0001091c $unwind$OrthoSolve 000000018006f91c poser_daveortho.obj + 0003:00010938 $unwind$PoserDaveOrtho 000000018006f938 poser_daveortho.obj + 0003:00010954 $unwind$REGISTERPoserDaveOrtho 000000018006f954 poser_daveortho.obj + 0003:00010968 $unwind$PoserDummy 000000018006f968 poser_dummy.obj + 0003:0001097c $unwind$REGISTERPoserDummy 000000018006f97c poser_dummy.obj + 0003:00010990 $unwind$distance 000000018006f990 poser_octavioradii.obj + 0003:000109a4 $unwind$angleBetweenSensors 000000018006f9a4 poser_octavioradii.obj + 0003:000109b8 $unwind$calculateFitness 000000018006f9b8 poser_octavioradii.obj + 0003:000109cc $unwind$getGradient 000000018006f9cc poser_octavioradii.obj + 0003:000109e8 $unwind$normalizeAndMultiplyVector 000000018006f9e8 poser_octavioradii.obj + 0003:000109fc $unwind$RefineEstimateUsingGradientDescentRadii 000000018006f9fc poser_octavioradii.obj + 0003:00010a18 $unwind$SolveForLighthouseRadii 000000018006fa18 poser_octavioradii.obj + 0003:00010a34 $unwind$QuickPose 000000018006fa34 poser_octavioradii.obj + 0003:00010a50 $unwind$PoserOctavioRadii 000000018006fa50 poser_octavioradii.obj + 0003:00010a6c $unwind$REGISTERPoserOctavioRadii 000000018006fa6c poser_octavioradii.obj + 0003:00010a80 $unwind$writePoint 000000018006fa80 poser_turveytori.obj + 0003:00010a94 $unwind$updateHeader 000000018006fa94 poser_turveytori.obj + 0003:00010aa8 $unwind$writeAxes 000000018006faa8 poser_turveytori.obj + 0003:00010abc $unwind$drawLineBetweenPoints 000000018006fabc poser_turveytori.obj + 0003:00010ad0 $unwind$writePcdHeader 000000018006fad0 poser_turveytori.obj + 0003:00010ae4 $unwind$writePointCloud 000000018006fae4 poser_turveytori.obj + 0003:00010af8 $unwind$markPointWithStar 000000018006faf8 poser_turveytori.obj + 0003:00010b0c $unwind$distance 000000018006fb0c poser_turveytori.obj + 0003:00010b20 $unwind$GetRotationMatrixForTorus 000000018006fb20 poser_turveytori.obj + 0003:00010b3c $unwind$RotateAndTranslatePoint 000000018006fb3c poser_turveytori.obj + 0003:00010b58 $unwind$angleFromPoints 000000018006fb58 poser_turveytori.obj + 0003:00010b74 $unwind$midpoint 000000018006fb74 poser_turveytori.obj + 0003:00010b90 $unwind$estimateToroidalAndPoloidalAngleOfPoint 000000018006fb90 poser_turveytori.obj + 0003:00010bac $unwind$angleBetweenSensors 000000018006fbac poser_turveytori.obj + 0003:00010bc0 $unwind$pythAngleBetweenSensors2 000000018006fbc0 poser_turveytori.obj + 0003:00010bd4 $unwind$calculateTorusPointFromAngles 000000018006fbd4 poser_turveytori.obj + 0003:00010bf0 $unwind$getPointFitnessForPna 000000018006fbf0 poser_turveytori.obj + 0003:00010c0c $unwind$compareFlts 000000018006fc0c poser_turveytori.obj + 0003:00010c20 $unwind$getPointFitness 000000018006fc20 poser_turveytori.obj + 0003:00010c3c $unwind$getGradient 000000018006fc3c poser_turveytori.obj + 0003:00010c58 $unwind$getNormalizedAndScaledVector 000000018006fc58 poser_turveytori.obj + 0003:00010c74 $unwind$getAvgPoints 000000018006fc74 poser_turveytori.obj + 0003:00010c90 $unwind$RefineEstimateUsingModifiedGradientDescent1 000000018006fc90 poser_turveytori.obj + 0003:00010cac $unwind$RotationEstimateFitnessOld 000000018006fcac poser_turveytori.obj + 0003:00010cc8 $unwind$RotationEstimateFitnessAxisAngle 000000018006fcc8 poser_turveytori.obj + 0003:00010ce4 $unwind$RotationEstimateFitnessAxisAngleOriginal 000000018006fce4 poser_turveytori.obj + 0003:00010d00 $unwind$RotationEstimateFitnessQuaternion 000000018006fd00 poser_turveytori.obj + 0003:00010d1c $unwind$getRotationGradientQuaternion 000000018006fd1c poser_turveytori.obj + 0003:00010d38 $unwind$getRotationGradientAxisAngle 000000018006fd38 poser_turveytori.obj + 0003:00010d54 $unwind$getNormalizedAndScaledRotationGradient 000000018006fd54 poser_turveytori.obj + 0003:00010d68 $unwind$WhereIsTheTrackedObjectAxisAngle 000000018006fd68 poser_turveytori.obj + 0003:00010d7c $unwind$RefineRotationEstimateAxisAngle 000000018006fd7c poser_turveytori.obj + 0003:00010d98 $unwind$RefineRotationEstimateQuaternion 000000018006fd98 poser_turveytori.obj + 0003:00010db4 $unwind$SolveForRotation 000000018006fdb4 poser_turveytori.obj + 0003:00010dd0 $unwind$SolveForRotationQuat 000000018006fdd0 poser_turveytori.obj + 0003:00010dec $unwind$SolveForLighthouse 000000018006fdec poser_turveytori.obj + 0003:00010e08 $unwind$QuickPose 000000018006fe08 poser_turveytori.obj + 0003:00010e24 $unwind$PoserTurveyTori 000000018006fe24 poser_turveytori.obj + 0003:00010e4c $unwind$REGISTERPoserTurveyTori 000000018006fe4c poser_turveytori.obj + 0003:00010e60 $unwind$survive_verify_FLT_size 000000018006fe60 survive.obj + 0003:00010e74 $unwind$survive_init_internal 000000018006fe74 survive.obj + 0003:00010e88 $unwind$survive_install_htc_config_fn 000000018006fe88 survive.obj + 0003:00010e9c $unwind$survive_install_info_fn 000000018006fe9c survive.obj + 0003:00010eb0 $unwind$survive_install_error_fn 000000018006feb0 survive.obj + 0003:00010ec4 $unwind$survive_install_light_fn 000000018006fec4 survive.obj + 0003:00010ed8 $unwind$survive_install_imu_fn 000000018006fed8 survive.obj + 0003:00010eec $unwind$survive_install_angle_fn 000000018006feec survive.obj + 0003:00010f00 $unwind$survive_install_button_fn 000000018006ff00 survive.obj + 0003:00010f14 $unwind$survive_install_raw_pose_fn 000000018006ff14 survive.obj + 0003:00010f28 $unwind$survive_install_lighthouse_pose_fn 000000018006ff28 survive.obj + 0003:00010f3c $unwind$survive_startup 000000018006ff3c survive.obj + 0003:00010f58 $unwind$survive_poll 000000018006ff58 survive.obj + 0003:00010f6c $unwind$survive_close 000000018006ff6c survive.obj + 0003:00010f88 $unwind$survive_get_so_by_name 000000018006ff88 survive.obj + 0003:00010f9c $unwind$survive_simple_inflate 000000018006ff9c survive.obj + 0003:00010fb8 $unwind$survive_send_magic 000000018006ffb8 survive.obj + 0003:00010fcc $unwind$survive_haptic 000000018006ffcc survive.obj + 0003:00010fe0 $unwind$survive_add_object 000000018006ffe0 survive.obj + 0003:00010ff4 $unwind$survive_add_driver 000000018006fff4 survive.obj + 0003:00011008 $unwind$GetDriverByConfig 0000000180070008 survive.obj + 0003:00011024 $unwind$SymnumCheck 0000000180070024 survive.obj + 0003:00011038 $unwind$survivefault 0000000180070038 survive.obj + 0003:0001104c $unwind$survivenote 000000018007004c survive.obj + 0003:00011060 $unwind$button_servicer 0000000180070060 survive.obj + 0003:00011074 $unwind$vsnprintf 0000000180070074 survive_cal.obj + 0003:00011088 $unwind$snprintf 0000000180070088 survive_cal.obj + 0003:0001109c $unwind$survive_cal_install 000000018007009c survive_cal.obj + 0003:000110b8 $unwind$survive_cal_get_status 00000001800700b8 survive_cal.obj + 0003:000110cc $unwind$survive_cal_light 00000001800700cc survive_cal.obj + 0003:000110e0 $unwind$survive_cal_angle 00000001800700e0 survive_cal.obj + 0003:000110fc $unwind$handle_calibration 00000001800700fc survive_cal.obj + 0003:00011118 $unwind$reset_calibration 0000000180070118 survive_cal.obj + 0003:0001112c $unwind$ootx_packet_clbk_d 000000018007012c survive_cal.obj + 0003:00011148 $unwind$decode_acode 0000000180070148 survive_charlesbiguator.obj + 0003:0001115c $unwind$HandleOOTX 000000018007015c survive_charlesbiguator.obj + 0003:00011170 $unwind$DisambiguatorCharles 0000000180070170 survive_charlesbiguator.obj + 0003:0001118c $unwind$REGISTERDisambiguatorCharles 000000018007018c survive_charlesbiguator.obj + 0003:000111a0 $unwind$survive_configf 00000001800701a0 survive_config.obj + 0003:000111b4 $unwind$survive_configi 00000001800701b4 survive_config.obj + 0003:000111c8 $unwind$survive_configs 00000001800701c8 survive_config.obj + 0003:000111dc $unwind$init_config_group 00000001800701dc survive_config.obj + 0003:000111f0 $unwind$destroy_config_group 00000001800701f0 survive_config.obj + 0003:00011204 $unwind$config_set_lighthouse 0000000180070204 survive_config.obj + 0003:00011218 $unwind$config_read_lighthouse 0000000180070218 survive_config.obj + 0003:00011234 $unwind$config_read 0000000180070234 survive_config.obj + 0003:00011248 $unwind$config_save 0000000180070248 survive_config.obj + 0003:0001125c $unwind$config_set_float 000000018007025c survive_config.obj + 0003:00011270 $unwind$config_set_uint32 0000000180070270 survive_config.obj + 0003:00011284 $unwind$config_set_str 0000000180070284 survive_config.obj + 0003:00011298 $unwind$config_read_float 0000000180070298 survive_config.obj + 0003:000112ac $unwind$config_read_float_array 00000001800702ac survive_config.obj + 0003:000112c0 $unwind$config_read_uint32 00000001800702c0 survive_config.obj + 0003:000112d4 $unwind$config_read_str 00000001800702d4 survive_config.obj + 0003:000112e8 $unwind$config_set_float_a 00000001800702e8 survive_config.obj + 0003:000112fc $unwind$init_config_entry 00000001800702fc survive_config.obj + 0003:00011310 $unwind$destroy_config_entry 0000000180070310 survive_config.obj + 0003:00011324 $unwind$resize_config_group 0000000180070324 survive_config.obj + 0003:00011338 $unwind$sstrcpy 0000000180070338 survive_config.obj + 0003:0001134c $unwind$find_config_entry 000000018007034c survive_config.obj + 0003:00011360 $unwind$next_unused_entry 0000000180070360 survive_config.obj + 0003:00011374 $unwind$_json_write_float_array 0000000180070374 survive_config.obj + 0003:00011388 $unwind$write_config_group 0000000180070388 survive_config.obj + 0003:0001139c $unwind$print_json_value 000000018007039c survive_config.obj + 0003:000113b0 $unwind$handle_config_group 00000001800703b0 survive_config.obj + 0003:000113c4 $unwind$pop_config_group 00000001800703c4 survive_config.obj + 0003:000113d8 $unwind$parse_floats 00000001800703d8 survive_config.obj + 0003:000113f4 $unwind$parse_uint32 00000001800703f4 survive_config.obj + 0003:00011410 $unwind$handle_tag_value 0000000180070410 survive_config.obj + 0003:00011424 $unwind$sc_search 0000000180070424 survive_config.obj + 0003:00011438 $unwind$config_entry_as_FLT 0000000180070438 survive_config.obj + 0003:0001144c $unwind$config_entry_as_uint32_t 000000018007044c survive_config.obj + 0003:00011460 $unwind$survive_create_hmd 0000000180070460 survive_default_devices.obj + 0003:00011474 $unwind$survive_create_wm0 0000000180070474 survive_default_devices.obj + 0003:00011488 $unwind$survive_create_wm1 0000000180070488 survive_default_devices.obj + 0003:0001149c $unwind$survive_create_tr0 000000018007049c survive_default_devices.obj + 0003:000114b0 $unwind$survive_create_ww0 00000001800704b0 survive_default_devices.obj + 0003:000114c4 $unwind$survive_load_htc_config_format 00000001800704c4 survive_default_devices.obj + 0003:000114e0 $unwind$survive_create_device 00000001800704e0 survive_default_devices.obj + 0003:000114f4 $unwind$jsoneq 00000001800704f4 survive_default_devices.obj + 0003:00011508 $unwind$ParsePoints 0000000180070508 survive_default_devices.obj + 0003:00011524 $unwind$handle_lightcap 0000000180070524 survive_disambiguator.obj + 0003:00011538 $unwind$RegisterDriver 0000000180070538 survive_driverman.obj + 0003:0001154c $unwind$GetDriver 000000018007054c survive_driverman.obj + 0003:00011560 $unwind$GetDriverNameMatching 0000000180070560 survive_driverman.obj + 0003:00011574 $unwind$ListDrivers 0000000180070574 survive_driverman.obj + 0003:00011588 $unwind$__local_stdio_scanf_options 0000000180070588 survive_playback.obj + 0003:0001159c $unwind$vfprintf 000000018007059c survive_playback.obj + 0003:000115b0 $unwind$_vsscanf_l 00000001800705b0 survive_playback.obj + 0003:000115c4 $unwind$sscanf 00000001800705c4 survive_playback.obj + 0003:000115d8 $unwind$timestamp_in_us 00000001800705d8 survive_playback.obj + 0003:000115ec $unwind$write_to_output 00000001800705ec survive_playback.obj + 0003:00011600 $unwind$survive_recording_config_process 0000000180070600 survive_playback.obj + 0003:00011614 $unwind$survive_recording_lighthouse_process 0000000180070614 survive_playback.obj + 0003:00011628 $unwind$survive_recording_raw_pose_process 0000000180070628 survive_playback.obj + 0003:0001163c $unwind$survive_recording_info_process 000000018007063c survive_playback.obj + 0003:00011650 $unwind$survive_recording_angle_process 0000000180070650 survive_playback.obj + 0003:00011664 $unwind$survive_recording_lightcap 0000000180070664 survive_playback.obj + 0003:00011678 $unwind$survive_recording_light_process 0000000180070678 survive_playback.obj + 0003:0001168c $unwind$survive_recording_imu_process 000000018007068c survive_playback.obj + 0003:000116a0 $unwind$parse_and_run_imu 00000001800706a0 survive_playback.obj + 0003:000116bc $unwind$parse_and_run_rawlight 00000001800706bc survive_playback.obj + 0003:000116d8 $unwind$parse_and_run_lightcode 00000001800706d8 survive_playback.obj + 0003:000116f4 $unwind$playback_poll 00000001800706f4 survive_playback.obj + 0003:00011710 $unwind$playback_close 0000000180070710 survive_playback.obj + 0003:00011724 $unwind$survive_install_recording 0000000180070724 survive_playback.obj + 0003:00011740 $unwind$DriverRegPlayback 0000000180070740 survive_playback.obj + 0003:0001175c $unwind$REGISTERDriverRegPlayback 000000018007075c survive_playback.obj + 0003:00011770 $unwind$survive_default_light_process 0000000180070770 survive_process.obj + 0003:00011784 $unwind$survive_default_imu_process 0000000180070784 survive_process.obj + 0003:000117a0 $unwind$survive_default_angle_process 00000001800707a0 survive_process.obj + 0003:000117b4 $unwind$survive_default_button_process 00000001800707b4 survive_process.obj + 0003:000117c8 $unwind$survive_default_raw_pose_process 00000001800707c8 survive_process.obj + 0003:000117dc $unwind$survive_default_lighthouse_pose_process 00000001800707dc survive_process.obj + 0003:000117f0 $unwind$survive_default_htc_config_process 00000001800707f0 survive_process.obj + 0003:00011804 $unwind$survive_calibration_options_config_apply 0000000180070804 survive_reproject.obj + 0003:00011818 $unwind$survive_calibration_default_config 0000000180070818 survive_reproject.obj + 0003:0001182c $unwind$survive_calibration_config_max_idx 000000018007082c survive_reproject.obj + 0003:00011848 $unwind$survive_calibration_config_create_from_idx 0000000180070848 survive_reproject.obj + 0003:00011864 $unwind$survive_calibration_config_index 0000000180070864 survive_reproject.obj + 0003:00011878 $unwind$survive_reproject 0000000180070878 survive_reproject.obj + 0003:0001188c $unwind$survive_reproject_from_pose 000000018007088c survive_reproject.obj + 0003:000118a0 $unwind$survive_reproject_from_pose_with_config 00000001800708a0 survive_reproject.obj + 0003:000118bc $unwind$survive_calibration_options_config_normalize 00000001800708bc survive_reproject.obj + 0003:000118d0 $unwind$gibf 00000001800708d0 survive_reproject.obj + 0003:000118e4 $unwind$SurviveSensorActivations_add 00000001800708e4 survive_sensor_activations.obj + 0003:000118f8 $unwind$SurviveSensorActivations_add_imu 00000001800708f8 survive_sensor_activations.obj + 0003:0001190c $unwind$SurviveSensorActivations_isPairValid 000000018007090c survive_sensor_activations.obj + 0003:00011920 $unwind$handle_lightcap2_getAcodeFromSyncPulse 0000000180070920 survive_turveybiguator.obj + 0003:00011934 $unwind$remove_outliers 0000000180070934 survive_turveybiguator.obj + 0003:00011948 $unwind$handle_lightcap2_process_sweep_data 0000000180070948 survive_turveybiguator.obj + 0003:0001195c $unwind$handle_lightcap2_sync 000000018007095c survive_turveybiguator.obj + 0003:00011970 $unwind$handle_lightcap2_sweep 0000000180070970 survive_turveybiguator.obj + 0003:00011984 $unwind$DisambiguatorTurvey 0000000180070984 survive_turveybiguator.obj + 0003:00011998 $unwind$REGISTERDisambiguatorTurvey 0000000180070998 survive_turveybiguator.obj + 0003:000119ac $unwind$_vfwprintf_l 00000001800709ac survive_vive.obj + 0003:000119c0 $unwind$wprintf 00000001800709c0 survive_vive.obj + 0003:000119d4 $unwind$survive_data_cb 00000001800709d4 survive_vive.obj + 0003:000119f0 $unwind$survive_usb_init 00000001800709f0 survive_vive.obj + 0003:00011a0c $unwind$survive_get_config 0000000180070a0c survive_vive.obj + 0003:00011a28 $unwind$survive_vive_send_magic 0000000180070a28 survive_vive.obj + 0003:00011a44 $unwind$HAPIReceiver 0000000180070a44 survive_vive.obj + 0003:00011a58 $unwind$AttachInterface 0000000180070a58 survive_vive.obj + 0003:00011a6c $unwind$update_feature_report 0000000180070a6c survive_vive.obj + 0003:00011a80 $unwind$getupdate_feature_report 0000000180070a80 survive_vive.obj + 0003:00011a94 $unwind$hid_get_feature_report_timeout 0000000180070a94 survive_vive.obj + 0003:00011aa8 $unwind$survive_vive_send_haptic 0000000180070aa8 survive_vive.obj + 0003:00011ac4 $unwind$survive_vive_usb_close 0000000180070ac4 survive_vive.obj + 0003:00011ad8 $unwind$survive_vive_usb_poll 0000000180070ad8 survive_vive.obj + 0003:00011aec $unwind$calibrate_acc 0000000180070aec survive_vive.obj + 0003:00011b00 $unwind$calibrate_gyro 0000000180070b00 survive_vive.obj + 0003:00011b14 $unwind$incrementAndPostButtonQueue 0000000180070b14 survive_vive.obj + 0003:00011b28 $unwind$registerButtonEvent 0000000180070b28 survive_vive.obj + 0003:00011b3c $unwind$handle_watchman 0000000180070b3c survive_vive.obj + 0003:00011b58 $unwind$LoadConfig 0000000180070b58 survive_vive.obj + 0003:00011b74 $unwind$survive_vive_close 0000000180070b74 survive_vive.obj + 0003:00011b88 $unwind$init_SurviveObject 0000000180070b88 survive_vive.obj + 0003:00011b9c $unwind$DriverRegHTCVive 0000000180070b9c survive_vive.obj + 0003:00011bb8 $unwind$REGISTERDriverRegHTCVive 0000000180070bb8 survive_vive.obj + 0003:00011bcc $unwind$getdelim 0000000180070bcc getdelim.obj + 0003:00011be0 $unwind$getline 0000000180070be0 getdelim.obj + 0003:00011bf4 $unwind$_RTC_Shutdown 0000000180070bf4 MSVCRTD:_init_.obj + 0003:00011bfc $unwind$_RTC_InitBase 0000000180070bfc MSVCRTD:_init_.obj + 0003:00011c04 $unwind$__report_securityfailure 0000000180070c04 MSVCRTD:gs_report.obj + 0003:00011c0c $unwind$__report_securityfailureEx 0000000180070c0c MSVCRTD:gs_report.obj + 0003:00011c14 $unwind$__report_rangecheckfailure 0000000180070c14 MSVCRTD:gs_report.obj + 0003:00011c1c $unwind$__report_gsfailure 0000000180070c1c MSVCRTD:gs_report.obj + 0003:00011c24 $unwind$capture_current_context 0000000180070c24 MSVCRTD:gs_report.obj + 0003:00011c2c $unwind$capture_previous_context 0000000180070c2c MSVCRTD:gs_report.obj + 0003:00011c34 $unwind$__raise_securityfailure 0000000180070c34 MSVCRTD:gs_report.obj + 0003:00011c3c $unwind$_RTC_CheckStackVars 0000000180070c3c MSVCRTD:_stack_.obj + 0003:00011c50 $chain$0$_RTC_CheckStackVars 0000000180070c50 MSVCRTD:_stack_.obj + 0003:00011c68 $chain$1$_RTC_CheckStackVars 0000000180070c68 MSVCRTD:_stack_.obj + 0003:00011c7c $unwind$_RTC_CheckStackVars2 0000000180070c7c MSVCRTD:_stack_.obj + 0003:00011c8c $chain$1$_RTC_CheckStackVars2 0000000180070c8c MSVCRTD:_stack_.obj + 0003:00011ca8 $chain$2$_RTC_CheckStackVars2 0000000180070ca8 MSVCRTD:_stack_.obj + 0003:00011cc0 $chain$3$_RTC_CheckStackVars2 0000000180070cc0 MSVCRTD:_stack_.obj + 0003:00011cd8 $chain$4$_RTC_CheckStackVars2 0000000180070cd8 MSVCRTD:_stack_.obj + 0003:00011cec $chain$5$_RTC_CheckStackVars2 0000000180070cec MSVCRTD:_stack_.obj + 0003:00011d00 $chain$6$_RTC_CheckStackVars2 0000000180070d00 MSVCRTD:_stack_.obj + 0003:00011d14 $unwind$_RTC_AllocaHelper 0000000180070d14 MSVCRTD:_stack_.obj + 0003:00011d1c $chain$0$_RTC_AllocaHelper 0000000180070d1c MSVCRTD:_stack_.obj + 0003:00011d34 $chain$1$_RTC_AllocaHelper 0000000180070d34 MSVCRTD:_stack_.obj + 0003:00011d48 $unwind$__GSHandlerCheckCommon 0000000180070d48 MSVCRTD:_gshandler_.obj + 0003:00011d50 $unwind$__GSHandlerCheck 0000000180070d50 MSVCRTD:_gshandler_.obj + 0003:00011d58 $xdatasym 0000000180070d58 MSVCRTD:_amdsecgs_.obj + 0003:00011d60 $xdatasym 0000000180070d60 MSVCRTD:_chkstk_.obj + 0003:00011d68 $unwind$?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 0000000180070d68 MSVCRTD:dll_dllmain.obj + 0003:00011d8c $unwind$?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 0000000180070d8c MSVCRTD:dll_dllmain.obj + 0003:00011d94 $unwind$?dllmain_crt_process_detach@@YAH_N@Z 0000000180070d94 MSVCRTD:dll_dllmain.obj + 0003:00011db8 $unwind$?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 0000000180070db8 MSVCRTD:dll_dllmain.obj + 0003:00011dc0 $unwind$?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180070dc0 MSVCRTD:dll_dllmain.obj + 0003:00011dc8 $unwind$_CRT_INIT 0000000180070dc8 MSVCRTD:dll_dllmain.obj + 0003:00011dd0 $unwind$?dllmain_raw@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180070dd0 MSVCRTD:dll_dllmain.obj + 0003:00011dd8 $unwind$?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180070dd8 MSVCRTD:dll_dllmain.obj + 0003:00011dfc $unwind$?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 0000000180070dfc MSVCRTD:dll_dllmain.obj + 0003:00011e04 $unwind$_DllMainCRTStartup 0000000180070e04 MSVCRTD:dll_dllmain.obj + 0003:00011e0c $unwind$_RTC_UninitUse 0000000180070e0c MSVCRTD:_error_.obj + 0003:00011e28 $unwind$?_RTC_StackFailure@@YAXPEAXPEBD@Z 0000000180070e28 MSVCRTD:_error_.obj + 0003:00011e48 $unwind$?_RTC_AllocaFailure@@YAXPEAXPEAU_RTC_ALLOCA_NODE@@H@Z 0000000180070e48 MSVCRTD:_error_.obj + 0003:00011e64 $chain$0$?_RTC_AllocaFailure@@YAXPEAXPEAU_RTC_ALLOCA_NODE@@H@Z 0000000180070e64 MSVCRTD:_error_.obj + 0003:00011e7c $chain$1$?_RTC_AllocaFailure@@YAXPEAXPEAU_RTC_ALLOCA_NODE@@H@Z 0000000180070e7c MSVCRTD:_error_.obj + 0003:00011e90 $unwind$_vsprintf_s_l 0000000180070e90 MSVCRTD:_error_.obj + 0003:00011ea8 $unwind$sprintf_s 0000000180070ea8 MSVCRTD:_error_.obj + 0003:00011eb8 $unwind$?notify_debugger@@YAXAEBUtagEXCEPTION_VISUALCPP_DEBUG_INFO@@@Z 0000000180070eb8 MSVCRTD:_error_.obj + 0003:00011edc $unwind$?filt$0@?0??notify_debugger@@YAXAEBUtagEXCEPTION_VISUALCPP_DEBUG_INFO@@@Z@4HA 0000000180070edc MSVCRTD:_error_.obj + 0003:00011ee4 $unwind$?DebuggerProbe@@YA_NK@Z 0000000180070ee4 MSVCRTD:_error_.obj + 0003:00011eec $unwind$?DebuggerRuntime@@YA_NKHPEAXPEB_W@Z 0000000180070eec MSVCRTD:_error_.obj + 0003:00011ef4 $unwind$?failwithmessage@@YAXPEAXHHPEBD@Z 0000000180070ef4 MSVCRTD:_error_.obj + 0003:00011f1c $unwind$?_getMemBlockDataString@@YAXPEAD0PEBD_K@Z 0000000180070f1c MSVCRTD:_error_.obj + 0003:00011f30 $chain$3$?_getMemBlockDataString@@YAXPEAD0PEBD_K@Z 0000000180070f30 MSVCRTD:_error_.obj + 0003:00011f54 $chain$4$?_getMemBlockDataString@@YAXPEAD0PEBD_K@Z 0000000180070f54 MSVCRTD:_error_.obj + 0003:00011f68 $unwind$__security_init_cookie 0000000180070f68 MSVCRTD:gs_support.obj + 0003:00011f70 $unwind$__get_entropy 0000000180070f70 MSVCRTD:gs_support.obj + 0003:00011f78 $unwind$DllMain 0000000180070f78 MSVCRTD:dll_dllmain_stub.obj + 0003:00011f80 $unwind$?__scrt_initialize_type_info@@YAXXZ 0000000180070f80 MSVCRTD:tncleanup.obj + 0003:00011f88 $unwind$?__scrt_uninitialize_type_info@@YAXXZ 0000000180070f88 MSVCRTD:tncleanup.obj + 0003:00011f90 $unwind$__scrt_initialize_default_local_stdio_options 0000000180070f90 MSVCRTD:default_local_stdio_options.obj + 0003:00011f98 $unwind$atexit 0000000180070f98 MSVCRTD:utility.obj + 0003:00011fa0 $unwind$_onexit 0000000180070fa0 MSVCRTD:utility.obj + 0003:00011fa8 $unwind$at_quick_exit 0000000180070fa8 MSVCRTD:utility.obj + 0003:00011fb0 $unwind$__scrt_is_nonwritable_in_current_image 0000000180070fb0 MSVCRTD:utility.obj + 0003:00011fd4 $unwind$__scrt_is_nonwritable_in_current_image$filt$0 0000000180070fd4 MSVCRTD:utility.obj + 0003:00011fdc $unwind$__scrt_acquire_startup_lock 0000000180070fdc MSVCRTD:utility.obj + 0003:00011fe4 $unwind$__scrt_release_startup_lock 0000000180070fe4 MSVCRTD:utility.obj + 0003:00011fec $unwind$__scrt_initialize_crt 0000000180070fec MSVCRTD:utility.obj + 0003:00011ff4 $unwind$__scrt_uninitialize_crt 0000000180070ff4 MSVCRTD:utility.obj + 0003:00011ffc $unwind$__scrt_initialize_onexit_tables 0000000180070ffc MSVCRTD:utility.obj + 0003:0001200c $unwind$__scrt_dllmain_exception_filter 000000018007100c MSVCRTD:utility.obj + 0003:00012014 $unwind$__scrt_dllmain_before_initialize_c 0000000180071014 MSVCRTD:utility.obj + 0003:0001201c $unwind$__scrt_dllmain_after_initialize_c 000000018007101c MSVCRTD:utility.obj + 0003:00012024 $unwind$__scrt_dllmain_uninitialize_c 0000000180071024 MSVCRTD:utility.obj + 0003:0001202c $unwind$__scrt_dllmain_uninitialize_critical 000000018007102c MSVCRTD:utility.obj + 0003:00012034 $unwind$__scrt_dllmain_crt_thread_attach 0000000180071034 MSVCRTD:utility.obj + 0003:0001203c $unwind$__scrt_dllmain_crt_thread_detach 000000018007103c MSVCRTD:utility.obj + 0003:00012044 $unwind$?configure_argv@__scrt_narrow_argv_policy@@SAHXZ 0000000180071044 MSVCRTD:utility.obj + 0003:0001204c $unwind$?initialize_environment@__scrt_narrow_environment_policy@@SAHXZ 000000018007104c MSVCRTD:utility.obj + 0003:00012054 $unwind$?is_potentially_valid_image_base@@YA_NQEAX@Z 0000000180071054 MSVCRTD:utility.obj + 0003:0001205c $unwind$?find_pe_section@@YAPEAU_IMAGE_SECTION_HEADER@@QEAE_K@Z 000000018007105c MSVCRTD:utility.obj + 0003:00012064 $unwind$??$__crt_fast_decode_pointer@PEAP6AXXZ@@YAPEAP6AXXZQEAP6AXXZ@Z 0000000180071064 MSVCRTD:utility.obj + 0003:0001206c $unwind$??$__crt_fast_encode_pointer@PEAP6AXXZ@@YAPEAP6AXXZQEAP6AXXZ@Z 000000018007106c MSVCRTD:utility.obj + 0003:00012074 $unwind$__scrt_get_show_window_mode 0000000180071074 MSVCRTD:utility_desktop.obj + 0003:00012084 $unwind$__scrt_is_managed_app 0000000180071084 MSVCRTD:utility_desktop.obj + 0003:0001208c $unwind$__scrt_set_unhandled_exception_filter 000000018007108c MSVCRTD:utility_desktop.obj + 0003:00012094 $unwind$__scrt_fastfail 0000000180071094 MSVCRTD:utility_desktop.obj + 0003:000120a4 $unwind$__scrt_unhandled_exception_filter 00000001800710a4 MSVCRTD:utility_desktop.obj + 0003:000120ac $unwind$_RTC_Initialize 00000001800710ac MSVCRTD:_initsect_.obj + 0003:000120bc $chain$0$_RTC_Initialize 00000001800710bc MSVCRTD:_initsect_.obj + 0003:000120d4 $chain$1$_RTC_Initialize 00000001800710d4 MSVCRTD:_initsect_.obj + 0003:000120e8 $unwind$_RTC_Terminate 00000001800710e8 MSVCRTD:_initsect_.obj + 0003:000120f8 $chain$0$_RTC_Terminate 00000001800710f8 MSVCRTD:_initsect_.obj + 0003:00012110 $chain$1$_RTC_Terminate 0000000180071110 MSVCRTD:_initsect_.obj + 0003:00012124 $unwind$_guard_check_icall 0000000180071124 MSVCRTD:checkcfg.obj + 0003:0001212c $unwind$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 000000018007112c MSVCRTD:_pdblkup_.obj + 0003:00012144 $chain$2$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180071144 MSVCRTD:_pdblkup_.obj + 0003:00012160 $chain$3$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180071160 MSVCRTD:_pdblkup_.obj + 0003:00012178 $chain$4$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180071178 MSVCRTD:_pdblkup_.obj + 0003:0001218c $chain$5$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 000000018007118c MSVCRTD:_pdblkup_.obj + 0003:000121a0 $unwind$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 00000001800711a0 MSVCRTD:_pdblkup_.obj + 0003:000121bc $chain$0$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 00000001800711bc MSVCRTD:_pdblkup_.obj + 0003:000121d4 $chain$1$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 00000001800711d4 MSVCRTD:_pdblkup_.obj + 0003:000121ec $chain$2$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 00000001800711ec MSVCRTD:_pdblkup_.obj + 0003:00012204 $chain$3$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180071204 MSVCRTD:_pdblkup_.obj + 0003:00012218 $chain$4$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180071218 MSVCRTD:_pdblkup_.obj + 0003:0001222c $chain$5$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 000000018007122c MSVCRTD:_pdblkup_.obj + 0003:00012240 $unwind$?GetPdbDllPathFromFilePath@@YAHPEB_WPEA_W_K@Z 0000000180071240 MSVCRTD:_pdblkup_.obj + 0003:0001225c $unwind$?GetPdbDll@@YAPEAUHINSTANCE__@@XZ 000000018007125c MSVCRTD:_pdblkup_.obj + 0003:00012270 $unwind$__isa_available_init 0000000180071270 MSVCRTD:_cpu_disp_.obj + 0003:00012284 $unwind$__scrt_is_ucrt_dll_in_use 0000000180071284 MSVCRTD:ucrt_detection.obj + 0003:0001228c $unwind$ReadNoFence64 000000018007128c MSVCRTD:guard_support.obj + 0003:00012294 $unwind$ReadPointerNoFence 0000000180071294 MSVCRTD:guard_support.obj + 0003:0001229c $unwind$_guard_icall_checks_enforced 000000018007129c MSVCRTD:guard_support.obj + 0003:000122a4 $unwind$_guard_rf_checks_enforced 00000001800712a4 MSVCRTD:guard_support.obj + 0003:000122b0 $xdatasym 00000001800712b0 MSVCRTD:_guard_dispatch_.obj + 0003:000122b8 $xdatasym 00000001800712b8 MSVCRTD:_rfgfailure_.obj + 0003:00012640 .edata 0000000180071640 libsurvive.exp + 0003:00012668 rgpv 0000000180071668 libsurvive.exp + 0003:000126d4 rgszName 00000001800716d4 libsurvive.exp + 0003:00012740 rgwOrd 0000000180071740 libsurvive.exp + 0003:00012776 szName 0000000180071776 libsurvive.exp + 0003:00012785 $N00001 0000000180071785 libsurvive.exp + 0003:000127a2 $N00002 00000001800717a2 libsurvive.exp + 0003:000127be $N00003 00000001800717be libsurvive.exp + 0003:000127d7 $N00004 00000001800717d7 libsurvive.exp + 0003:000127f1 $N00005 00000001800717f1 libsurvive.exp + 0003:0001280a $N00006 000000018007180a libsurvive.exp + 0003:00012821 $N00007 0000000180071821 libsurvive.exp + 0003:00012834 $N00008 0000000180071834 libsurvive.exp + 0003:0001284e $N00009 000000018007184e libsurvive.exp + 0003:00012866 $N00010 0000000180071866 libsurvive.exp + 0003:00012870 $N00011 0000000180071870 libsurvive.exp + 0003:0001287e $N00012 000000018007187e libsurvive.exp + 0003:00012888 $N00013 0000000180071888 libsurvive.exp + 0003:00012891 $N00014 0000000180071891 libsurvive.exp + 0003:000128a6 $N00015 00000001800718a6 libsurvive.exp + 0003:000128bd $N00016 00000001800718bd libsurvive.exp + 0003:000128d4 $N00017 00000001800718d4 libsurvive.exp + 0003:000128f0 $N00018 00000001800718f0 libsurvive.exp + 0003:00012907 $N00019 0000000180071907 libsurvive.exp + 0003:00012924 $N00020 0000000180071924 libsurvive.exp + 0003:0001292d $N00021 000000018007192d libsurvive.exp + 0003:00012936 $N00022 0000000180071936 libsurvive.exp + 0003:00012944 $N00023 0000000180071944 libsurvive.exp + 0003:0001294d $N00024 000000018007194d libsurvive.exp + 0003:0001295e $N00025 000000018007195e libsurvive.exp + 0003:00012976 $N00026 0000000180071976 libsurvive.exp + 0003:0001298a $N00027 000000018007198a libsurvive.exp + 0004:00000000 crc32_tab 0000000180072000 crc32.obj + 0004:00000544 ?virgin@?1??fixed@@9@9 0000000180072544 puff.obj + 0004:00000568 ?counter@?O@??PoserOctavioRadii@@9@9 0000000180072568 poser_octavioradii.obj + 0004:00000574 RED 0000000180072574 poser_turveytori.obj + 0004:00000578 GREEN 0000000180072578 poser_turveytori.obj + 0004:0000057c BLUE 000000018007257c poser_turveytori.obj + 0004:00000580 ?firstRun@?1??PoserTurveyTori@@9@9 0000000180072580 poser_turveytori.obj + 0004:00000584 ?counter@?L@??PoserTurveyTori@@9@9 0000000180072584 poser_turveytori.obj + 0004:00000588 ?counter@?M@??PoserTurveyTori@@9@9 0000000180072588 poser_turveytori.obj + 0004:00000600 ?vive_magic_power_on@?3??survive_vive_send_magic@@9@9 0000000180072600 survive_vive.obj + 0004:00000640 ?vive_magic_enable_lighthouse@?4??survive_vive_send_magic@@9@9 0000000180072640 survive_vive.obj + 0004:00000648 ?vive_magic_enable_lighthouse2@?4??survive_vive_send_magic@@9@9 0000000180072648 survive_vive.obj + 0004:00000650 ?vive_magic_power_on@?5??survive_vive_send_magic@@9@9 0000000180072650 survive_vive.obj + 0004:00000658 ?vive_magic_enable_lighthouse@?6??survive_vive_send_magic@@9@9 0000000180072658 survive_vive.obj + 0004:00000660 ?vive_magic_enable_lighthouse2@?6??survive_vive_send_magic@@9@9 0000000180072660 survive_vive.obj + 0004:00000668 ?vive_magic_power_on@?7??survive_vive_send_magic@@9@9 0000000180072668 survive_vive.obj + 0004:00000670 ?vive_magic_enable_lighthouse@?8??survive_vive_send_magic@@9@9 0000000180072670 survive_vive.obj + 0004:00000678 ?vive_magic_enable_lighthouse2@?8??survive_vive_send_magic@@9@9 0000000180072678 survive_vive.obj + 0004:00000680 ?vive_magic_power_off1@?L@??survive_vive_send_magic@@9@9 0000000180072680 survive_vive.obj + 0004:000006c0 ?vive_magic_power_off2@?L@??survive_vive_send_magic@@9@9 00000001800726c0 survive_vive.obj + 0004:000008e0 lib_handle 00000001800728e0 hid-windows.obj + 0004:000008e8 initialized 00000001800728e8 hid-windows.obj + 0004:000008f0 HidD_GetAttributes 00000001800728f0 hid-windows.obj + 0004:000008f8 HidD_GetSerialNumberString 00000001800728f8 hid-windows.obj + 0004:00000900 HidD_GetManufacturerString 0000000180072900 hid-windows.obj + 0004:00000908 HidD_GetProductString 0000000180072908 hid-windows.obj + 0004:00000910 HidD_SetFeature 0000000180072910 hid-windows.obj + 0004:00000918 HidD_GetFeature 0000000180072918 hid-windows.obj + 0004:00000920 HidD_GetIndexedString 0000000180072920 hid-windows.obj + 0004:00000928 HidD_GetPreparsedData 0000000180072928 hid-windows.obj + 0004:00000930 HidD_FreePreparsedData 0000000180072930 hid-windows.obj + 0004:00000938 HidP_GetCaps 0000000180072938 hid-windows.obj + 0004:00000940 HidD_SetNumInputBuffers 0000000180072940 hid-windows.obj + 0004:00000980 ?lpf@?1??OGGetAbsoluteTime@@9@9 0000000180072980 os_generic.obj + 0004:00000988 ?NtQuerySemaphore@?1??OGGetSema@@9@9 0000000180072988 os_generic.obj + 0004:000009a0 ?lencnt@?1??fixed@@9@9 00000001800729a0 puff.obj + 0004:000009c0 ?lensym@?1??fixed@@9@9 00000001800729c0 puff.obj + 0004:00000c00 ?distcnt@?1??fixed@@9@9 0000000180072c00 puff.obj + 0004:00000c20 ?distsym@?1??fixed@@9@9 0000000180072c20 puff.obj + 0004:00000c60 ?lencode@?1??fixed@@9@9 0000000180072c60 puff.obj + 0004:00000c70 ?distcode@?1??fixed@@9@9 0000000180072c70 puff.obj + 0004:00000d58 ttDebug 0000000180072d58 poser_turveytori.obj + 0004:00000d5c did_runtime_symnum 0000000180072d5c survive.obj + 0004:00000d60 ?lighthouses_completed@?1??ootx_packet_clbk_d@@9@9 0000000180072d60 survive_cal.obj + 0004:00000d70 Drivers 0000000180072d70 survive_driverman.obj + 0004:00000e70 DriverNames 0000000180072e70 survive_driverman.obj + 0004:00000f70 NrDrivers 0000000180072f70 survive_driverman.obj + 0004:00000fe0 ?start_time_us@?1??timestamp_in_us@@9@9 0000000180072fe0 survive_playback.obj + 0004:00000fe8 ?display_once@?3??parse_and_run_imu@@9@9 0000000180072fe8 survive_playback.obj + 0004:00000fe9 ?display_once@?2??parse_and_run_rawlight@@9@9 0000000180072fe9 survive_playback.obj + 0004:00000fea ?display_once@?3??parse_and_run_lightcode@@9@9 0000000180072fea survive_playback.obj + 0004:00000ff0 ?def@?1??survive_calibration_default_config@@9@9 0000000180072ff0 survive_reproject.obj + 0004:00001000 ?counts@?9??handle_lightcap2_process_sweep_data@@9@9 0000000180073000 survive_turveybiguator.obj + 0004:00001133 ?init@?1??_RTC_InitBase@@9@4_NA 0000000180073133 MSVCRTD:_init_.obj + 0004:00001140 GS_ExceptionRecord 0000000180073140 MSVCRTD:gs_report.obj + 0004:000011e0 GS_ContextRecord 00000001800731e0 MSVCRTD:gs_report.obj + 0004:000017c8 ?__proc_attached@@3HA 00000001800737c8 MSVCRTD:dll_dllmain.obj + 0004:000017d0 ?_RTC_ErrorReportFunc@@3P6AHHPEBDH00ZZEA 00000001800737d0 MSVCRTD:_userapi_.obj + 0004:000017d8 ?_RTC_ErrorReportFuncW@@3P6AHHPEB_WH00ZZEA 00000001800737d8 MSVCRTD:_userapi_.obj + 0004:0000182c ?module_local_atexit_table_initialized@@3_NA 000000018007382c MSVCRTD:utility.obj + 0004:00001838 ?module_local_atexit_table@@3U_onexit_table_t@@A 0000000180073838 MSVCRTD:utility.obj + 0004:00001850 ?module_local_at_quick_exit_table@@3U_onexit_table_t@@A 0000000180073850 MSVCRTD:utility.obj + 0004:00001868 ?is_initialized_as_dll@@3_NA 0000000180073868 MSVCRTD:utility.obj + 0004:00001880 ?mspdb@@3PEAUHINSTANCE__@@EA 0000000180073880 MSVCRTD:_pdblkup_.obj + 0004:00001889 ?alreadyTried@?1??GetPdbDll@@YAPEAUHINSTANCE__@@XZ@4_NA 0000000180073889 MSVCRTD:_pdblkup_.obj + 0004:0000188a ?PDBOK@?1??_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z@4_NA 000000018007388a MSVCRTD:_pdblkup_.obj + 0005:00001800 $pdata$crc32 0000000180076800 crc32.obj + 0005:0000180c $pdata$free_hid_device 000000018007680c hid-windows.obj + 0005:00001818 $pdata$hid_close 0000000180076818 hid-windows.obj + 0005:00001824 $pdata$hid_enumerate 0000000180076824 hid-windows.obj + 0005:00001830 $pdata$hid_error 0000000180076830 hid-windows.obj + 0005:0000183c $pdata$hid_exit 000000018007683c hid-windows.obj + 0005:00001848 $pdata$hid_free_enumeration 0000000180076848 hid-windows.obj + 0005:00001854 $pdata$hid_get_feature_report 0000000180076854 hid-windows.obj + 0005:00001860 $pdata$hid_get_indexed_string 0000000180076860 hid-windows.obj + 0005:0000186c $pdata$hid_get_manufacturer_string 000000018007686c hid-windows.obj + 0005:00001878 $pdata$hid_get_product_string 0000000180076878 hid-windows.obj + 0005:00001884 $pdata$hid_get_serial_number_string 0000000180076884 hid-windows.obj + 0005:00001890 $pdata$hid_init 0000000180076890 hid-windows.obj + 0005:0000189c $pdata$hid_open 000000018007689c hid-windows.obj + 0005:000018a8 $pdata$hid_open_path 00000001800768a8 hid-windows.obj + 0005:000018b4 $pdata$hid_read 00000001800768b4 hid-windows.obj + 0005:000018c0 $pdata$hid_read_timeout 00000001800768c0 hid-windows.obj + 0005:000018cc $pdata$hid_send_feature_report 00000001800768cc hid-windows.obj + 0005:000018d8 $pdata$hid_set_nonblocking 00000001800768d8 hid-windows.obj + 0005:000018e4 $pdata$hid_write 00000001800768e4 hid-windows.obj + 0005:000018f0 $pdata$lookup_functions 00000001800768f0 hid-windows.obj + 0005:000018fc $pdata$new_hid_device 00000001800768fc hid-windows.obj + 0005:00001908 $pdata$open_device 0000000180076908 hid-windows.obj + 0005:00001914 $pdata$register_error 0000000180076914 hid-windows.obj + 0005:00001920 $pdata$jsmn_alloc_token 0000000180076920 jsmn.obj + 0005:0000192c $pdata$jsmn_fill_token 000000018007692c jsmn.obj + 0005:00001938 $pdata$jsmn_init 0000000180076938 jsmn.obj + 0005:00001944 $pdata$jsmn_parse 0000000180076944 jsmn.obj + 0005:00001950 $pdata$jsmn_parse_primitive 0000000180076950 jsmn.obj + 0005:0000195c $pdata$jsmn_parse_string 000000018007695c jsmn.obj + 0005:00001968 $pdata$__local_stdio_printf_options 0000000180076968 json_helpers.obj + 0005:00001974 $pdata$_vfprintf_l 0000000180076974 json_helpers.obj + 0005:00001980 $pdata$_vscprintf 0000000180076980 json_helpers.obj + 0005:0000198c $pdata$_vscprintf_l 000000018007698c json_helpers.obj + 0005:00001998 $pdata$_vsnprintf 0000000180076998 json_helpers.obj + 0005:000019a4 $pdata$_vsnprintf_l 00000001800769a4 json_helpers.obj + 0005:000019b0 $pdata$asprintf 00000001800769b0 json_helpers.obj + 0005:000019bc $pdata$fprintf 00000001800769bc json_helpers.obj + 0005:000019c8 $pdata$json_load_array 00000001800769c8 json_helpers.obj + 0005:000019d4 $pdata$json_load_file 00000001800769d4 json_helpers.obj + 0005:000019e0 $pdata$json_write_double_array 00000001800769e0 json_helpers.obj + 0005:000019ec $pdata$json_write_float 00000001800769ec json_helpers.obj + 0005:000019f8 $pdata$json_write_float_array 00000001800769f8 json_helpers.obj + 0005:00001a04 $pdata$json_write_str 0000000180076a04 json_helpers.obj + 0005:00001a10 $pdata$json_write_uint32 0000000180076a10 json_helpers.obj + 0005:00001a1c $pdata$load_file_to_mem 0000000180076a1c json_helpers.obj + 0005:00001a28 $pdata$parse_float_array 0000000180076a28 json_helpers.obj + 0005:00001a34 $pdata$substr 0000000180076a34 json_helpers.obj + 0005:00001a40 $pdata$ApplyPoseToPoint 0000000180076a40 linmath.obj + 0005:00001a4c $pdata$ApplyPoseToPose 0000000180076a4c linmath.obj + 0005:00001a58 $pdata$InvertPose 0000000180076a58 linmath.obj + 0005:00001a64 $pdata$add3d 0000000180076a64 linmath.obj + 0005:00001a70 $pdata$angleaxisfrom2vect 0000000180076a70 linmath.obj + 0005:00001a7c $pdata$anglebetween3d 0000000180076a7c linmath.obj + 0005:00001a88 $pdata$axisanglefromquat 0000000180076a88 linmath.obj + 0005:00001a94 $pdata$compare3d 0000000180076a94 linmath.obj + 0005:00001aa0 $pdata$copy3d 0000000180076aa0 linmath.obj + 0005:00001aac $pdata$cross3d 0000000180076aac linmath.obj + 0005:00001ab8 $pdata$dot3d 0000000180076ab8 linmath.obj + 0005:00001ac4 $pdata$inverseM33 0000000180076ac4 linmath.obj + 0005:00001ad0 $pdata$magnitude3d 0000000180076ad0 linmath.obj + 0005:00001adc $pdata$matrix44copy 0000000180076adc linmath.obj + 0005:00001ae8 $pdata$matrix44transpose 0000000180076ae8 linmath.obj + 0005:00001af4 $pdata$normalize3d 0000000180076af4 linmath.obj + 0005:00001b00 $pdata$quatadd 0000000180076b00 linmath.obj + 0005:00001b0c $pdata$quatcopy 0000000180076b0c linmath.obj + 0005:00001b18 $pdata$quatevenproduct 0000000180076b18 linmath.obj + 0005:00001b24 $pdata$quatfrom2vectors 0000000180076b24 linmath.obj + 0005:00001b30 $pdata$quatfromaxisangle 0000000180076b30 linmath.obj + 0005:00001b3c $pdata$quatfromeuler 0000000180076b3c linmath.obj + 0005:00001b48 $pdata$quatfrommatrix 0000000180076b48 linmath.obj + 0005:00001b54 $pdata$quatfrommatrix33 0000000180076b54 linmath.obj + 0005:00001b60 $pdata$quatgetconjugate 0000000180076b60 linmath.obj + 0005:00001b6c $pdata$quatgetreciprocal 0000000180076b6c linmath.obj + 0005:00001b78 $pdata$quatinnerproduct 0000000180076b78 linmath.obj + 0005:00001b84 $pdata$quatinvsqmagnitude 0000000180076b84 linmath.obj + 0005:00001b90 $pdata$quatmagnitude 0000000180076b90 linmath.obj + 0005:00001b9c $pdata$quatnormalize 0000000180076b9c linmath.obj + 0005:00001ba8 $pdata$quatoddproduct 0000000180076ba8 linmath.obj + 0005:00001bb4 $pdata$quatouterproduct 0000000180076bb4 linmath.obj + 0005:00001bc0 $pdata$quatrotateabout 0000000180076bc0 linmath.obj + 0005:00001bcc $pdata$quatrotatevector 0000000180076bcc linmath.obj + 0005:00001bd8 $pdata$quatscale 0000000180076bd8 linmath.obj + 0005:00001be4 $pdata$quatsetnone 0000000180076be4 linmath.obj + 0005:00001bf0 $pdata$quatslerp 0000000180076bf0 linmath.obj + 0005:00001bfc $pdata$quatsub 0000000180076bfc linmath.obj + 0005:00001c08 $pdata$quattoeuler 0000000180076c08 linmath.obj + 0005:00001c14 $pdata$quattomatrix 0000000180076c14 linmath.obj + 0005:00001c20 $pdata$quattomatrix33 0000000180076c20 linmath.obj + 0005:00001c2c $pdata$rotate_vec 0000000180076c2c linmath.obj + 0005:00001c38 $pdata$rotatearoundaxis 0000000180076c38 linmath.obj + 0005:00001c44 $pdata$rotation_between_vecs_to_m3 0000000180076c44 linmath.obj + 0005:00001c50 $pdata$scale3d 0000000180076c50 linmath.obj + 0005:00001c5c $pdata$sub3d 0000000180076c5c linmath.obj + 0005:00001c68 $pdata$OGCancelThread 0000000180076c68 os_generic.obj + 0005:00001c74 $pdata$OGCreateMutex 0000000180076c74 os_generic.obj + 0005:00001c80 $pdata$OGCreateSema 0000000180076c80 os_generic.obj + 0005:00001c8c $pdata$OGCreateThread 0000000180076c8c os_generic.obj + 0005:00001c98 $pdata$OGDeleteMutex 0000000180076c98 os_generic.obj + 0005:00001ca4 $pdata$OGDeleteSema 0000000180076ca4 os_generic.obj + 0005:00001cb0 $pdata$OGGetAbsoluteTime 0000000180076cb0 os_generic.obj + 0005:00001cbc $pdata$OGGetFileTime 0000000180076cbc os_generic.obj + 0005:00001cc8 $pdata$OGGetSema 0000000180076cc8 os_generic.obj + 0005:00001cd4 $pdata$OGJoinThread 0000000180076cd4 os_generic.obj + 0005:00001ce0 $pdata$OGLockMutex 0000000180076ce0 os_generic.obj + 0005:00001cec $pdata$OGLockSema 0000000180076cec os_generic.obj + 0005:00001cf8 $pdata$OGSleep 0000000180076cf8 os_generic.obj + 0005:00001d04 $pdata$OGUSleep 0000000180076d04 os_generic.obj + 0005:00001d10 $pdata$OGUnlockMutex 0000000180076d10 os_generic.obj + 0005:00001d1c $pdata$OGUnlockSema 0000000180076d1c os_generic.obj + 0005:00001d28 $pdata$bits 0000000180076d28 puff.obj + 0005:00001d34 $pdata$codes 0000000180076d34 puff.obj + 0005:00001d40 $pdata$construct 0000000180076d40 puff.obj + 0005:00001d4c $pdata$decode 0000000180076d4c puff.obj + 0005:00001d58 $pdata$dynamic 0000000180076d58 puff.obj + 0005:00001d64 $pdata$fixed 0000000180076d64 puff.obj + 0005:00001d70 $pdata$puff 0000000180076d70 puff.obj + 0005:00001d7c $pdata$stored 0000000180076d7c puff.obj + 0005:00001d88 $pdata$EnumerateSymbols 0000000180076d88 symbol_enumerator.obj + 0005:00001d94 $pdata$mycb 0000000180076d94 symbol_enumerator.obj + 0005:00001da0 $pdata$_half_to_float 0000000180076da0 ootx_decoder.obj + 0005:00001dac $pdata$get_ptr 0000000180076dac ootx_decoder.obj + 0005:00001db8 $pdata$init_lighthouse_info_v6 0000000180076db8 ootx_decoder.obj + 0005:00001dc4 $pdata$ootx_decode_bit 0000000180076dc4 ootx_decoder.obj + 0005:00001dd0 $pdata$ootx_detect_preamble 0000000180076dd0 ootx_decoder.obj + 0005:00001ddc $pdata$ootx_free_decoder_context 0000000180076ddc ootx_decoder.obj + 0005:00001de8 $pdata$ootx_inc_buffer_offset 0000000180076de8 ootx_decoder.obj + 0005:00001df4 $pdata$ootx_init_decoder_context 0000000180076df4 ootx_decoder.obj + 0005:00001e00 $pdata$ootx_process_bit 0000000180076e00 ootx_decoder.obj + 0005:00001e0c $pdata$ootx_pump_bit 0000000180076e0c ootx_decoder.obj + 0005:00001e18 $pdata$ootx_reset_buffer 0000000180076e18 ootx_decoder.obj + 0005:00001e24 $pdata$ootx_write_to_buffer 0000000180076e24 ootx_decoder.obj + 0005:00001e30 $pdata$print_lighthouse_info_v6 0000000180076e30 ootx_decoder.obj + 0005:00001e3c $pdata$printf 0000000180076e3c ootx_decoder.obj + 0005:00001e48 $pdata$PoserData_lighthouse_pose_func 0000000180076e48 poser.obj + 0005:00001e54 $pdata$PoserData_poser_raw_pose_func 0000000180076e54 poser.obj + 0005:00001e60 $pdata$PoserCharlesSlow 0000000180076e60 poser_charlesslow.obj + 0005:00001e6c $pdata$REGISTERPoserCharlesSlow 0000000180076e6c poser_charlesslow.obj + 0005:00001e78 $pdata$RunOpti 0000000180076e78 poser_charlesslow.obj + 0005:00001e84 $pdata$_vsprintf_l 0000000180076e84 poser_charlesslow.obj + 0005:00001e90 $pdata$sprintf 0000000180076e90 poser_charlesslow.obj + 0005:00001e9c $pdata$OrthoSolve 0000000180076e9c poser_daveortho.obj + 0005:00001ea8 $pdata$PoserDaveOrtho 0000000180076ea8 poser_daveortho.obj + 0005:00001eb4 $pdata$REGISTERPoserDaveOrtho 0000000180076eb4 poser_daveortho.obj + 0005:00001ec0 $pdata$PoserDummy 0000000180076ec0 poser_dummy.obj + 0005:00001ecc $pdata$REGISTERPoserDummy 0000000180076ecc poser_dummy.obj + 0005:00001ed8 $pdata$PoserOctavioRadii 0000000180076ed8 poser_octavioradii.obj + 0005:00001ee4 $pdata$QuickPose 0000000180076ee4 poser_octavioradii.obj + 0005:00001ef0 $pdata$REGISTERPoserOctavioRadii 0000000180076ef0 poser_octavioradii.obj + 0005:00001efc $pdata$RefineEstimateUsingGradientDescentRadii 0000000180076efc poser_octavioradii.obj + 0005:00001f08 $pdata$SolveForLighthouseRadii 0000000180076f08 poser_octavioradii.obj + 0005:00001f14 $pdata$angleBetweenSensors 0000000180076f14 poser_octavioradii.obj + 0005:00001f20 $pdata$calculateFitness 0000000180076f20 poser_octavioradii.obj + 0005:00001f2c $pdata$distance 0000000180076f2c poser_octavioradii.obj + 0005:00001f38 $pdata$getGradient 0000000180076f38 poser_octavioradii.obj + 0005:00001f44 $pdata$normalizeAndMultiplyVector 0000000180076f44 poser_octavioradii.obj + 0005:00001f50 $pdata$GetRotationMatrixForTorus 0000000180076f50 poser_turveytori.obj + 0005:00001f5c $pdata$PoserTurveyTori 0000000180076f5c poser_turveytori.obj + 0005:00001f68 $pdata$QuickPose 0000000180076f68 poser_turveytori.obj + 0005:00001f74 $pdata$REGISTERPoserTurveyTori 0000000180076f74 poser_turveytori.obj + 0005:00001f80 $pdata$RefineEstimateUsingModifiedGradientDescent1 0000000180076f80 poser_turveytori.obj + 0005:00001f8c $pdata$RefineRotationEstimateAxisAngle 0000000180076f8c poser_turveytori.obj + 0005:00001f98 $pdata$RefineRotationEstimateQuaternion 0000000180076f98 poser_turveytori.obj + 0005:00001fa4 $pdata$RotateAndTranslatePoint 0000000180076fa4 poser_turveytori.obj + 0005:00001fb0 $pdata$RotationEstimateFitnessAxisAngle 0000000180076fb0 poser_turveytori.obj + 0005:00001fbc $pdata$RotationEstimateFitnessAxisAngleOriginal 0000000180076fbc poser_turveytori.obj + 0005:00001fc8 $pdata$RotationEstimateFitnessOld 0000000180076fc8 poser_turveytori.obj + 0005:00001fd4 $pdata$RotationEstimateFitnessQuaternion 0000000180076fd4 poser_turveytori.obj + 0005:00001fe0 $pdata$SolveForLighthouse 0000000180076fe0 poser_turveytori.obj + 0005:00001fec $pdata$SolveForRotation 0000000180076fec poser_turveytori.obj + 0005:00001ff8 $pdata$SolveForRotationQuat 0000000180076ff8 poser_turveytori.obj + 0005:00002004 $pdata$WhereIsTheTrackedObjectAxisAngle 0000000180077004 poser_turveytori.obj + 0005:00002010 $pdata$angleBetweenSensors 0000000180077010 poser_turveytori.obj + 0005:0000201c $pdata$angleFromPoints 000000018007701c poser_turveytori.obj + 0005:00002028 $pdata$calculateTorusPointFromAngles 0000000180077028 poser_turveytori.obj + 0005:00002034 $pdata$compareFlts 0000000180077034 poser_turveytori.obj + 0005:00002040 $pdata$distance 0000000180077040 poser_turveytori.obj + 0005:0000204c $pdata$drawLineBetweenPoints 000000018007704c poser_turveytori.obj + 0005:00002058 $pdata$estimateToroidalAndPoloidalAngleOfPoint 0000000180077058 poser_turveytori.obj + 0005:00002064 $pdata$getAvgPoints 0000000180077064 poser_turveytori.obj + 0005:00002070 $pdata$getGradient 0000000180077070 poser_turveytori.obj + 0005:0000207c $pdata$getNormalizedAndScaledRotationGradient 000000018007707c poser_turveytori.obj + 0005:00002088 $pdata$getNormalizedAndScaledVector 0000000180077088 poser_turveytori.obj + 0005:00002094 $pdata$getPointFitness 0000000180077094 poser_turveytori.obj + 0005:000020a0 $pdata$getPointFitnessForPna 00000001800770a0 poser_turveytori.obj + 0005:000020ac $pdata$getRotationGradientAxisAngle 00000001800770ac poser_turveytori.obj + 0005:000020b8 $pdata$getRotationGradientQuaternion 00000001800770b8 poser_turveytori.obj + 0005:000020c4 $pdata$markPointWithStar 00000001800770c4 poser_turveytori.obj + 0005:000020d0 $pdata$midpoint 00000001800770d0 poser_turveytori.obj + 0005:000020dc $pdata$pythAngleBetweenSensors2 00000001800770dc poser_turveytori.obj + 0005:000020e8 $pdata$updateHeader 00000001800770e8 poser_turveytori.obj + 0005:000020f4 $pdata$writeAxes 00000001800770f4 poser_turveytori.obj + 0005:00002100 $pdata$writePcdHeader 0000000180077100 poser_turveytori.obj + 0005:0000210c $pdata$writePoint 000000018007710c poser_turveytori.obj + 0005:00002118 $pdata$writePointCloud 0000000180077118 poser_turveytori.obj + 0005:00002124 $pdata$GetDriverByConfig 0000000180077124 survive.obj + 0005:00002130 $pdata$SymnumCheck 0000000180077130 survive.obj + 0005:0000213c $pdata$button_servicer 000000018007713c survive.obj + 0005:00002148 $pdata$survive_add_driver 0000000180077148 survive.obj + 0005:00002154 $pdata$survive_add_object 0000000180077154 survive.obj + 0005:00002160 $pdata$survive_close 0000000180077160 survive.obj + 0005:0000216c $pdata$survive_get_so_by_name 000000018007716c survive.obj + 0005:00002178 $pdata$survive_haptic 0000000180077178 survive.obj + 0005:00002184 $pdata$survive_init_internal 0000000180077184 survive.obj + 0005:00002190 $pdata$survive_install_angle_fn 0000000180077190 survive.obj + 0005:0000219c $pdata$survive_install_button_fn 000000018007719c survive.obj + 0005:000021a8 $pdata$survive_install_error_fn 00000001800771a8 survive.obj + 0005:000021b4 $pdata$survive_install_htc_config_fn 00000001800771b4 survive.obj + 0005:000021c0 $pdata$survive_install_imu_fn 00000001800771c0 survive.obj + 0005:000021cc $pdata$survive_install_info_fn 00000001800771cc survive.obj + 0005:000021d8 $pdata$survive_install_light_fn 00000001800771d8 survive.obj + 0005:000021e4 $pdata$survive_install_lighthouse_pose_fn 00000001800771e4 survive.obj + 0005:000021f0 $pdata$survive_install_raw_pose_fn 00000001800771f0 survive.obj + 0005:000021fc $pdata$survive_poll 00000001800771fc survive.obj + 0005:00002208 $pdata$survive_send_magic 0000000180077208 survive.obj + 0005:00002214 $pdata$survive_simple_inflate 0000000180077214 survive.obj + 0005:00002220 $pdata$survive_startup 0000000180077220 survive.obj + 0005:0000222c $pdata$survive_verify_FLT_size 000000018007722c survive.obj + 0005:00002238 $pdata$survivefault 0000000180077238 survive.obj + 0005:00002244 $pdata$survivenote 0000000180077244 survive.obj + 0005:00002250 $pdata$handle_calibration 0000000180077250 survive_cal.obj + 0005:0000225c $pdata$ootx_packet_clbk_d 000000018007725c survive_cal.obj + 0005:00002268 $pdata$reset_calibration 0000000180077268 survive_cal.obj + 0005:00002274 $pdata$snprintf 0000000180077274 survive_cal.obj + 0005:00002280 $pdata$survive_cal_angle 0000000180077280 survive_cal.obj + 0005:0000228c $pdata$survive_cal_get_status 000000018007728c survive_cal.obj + 0005:00002298 $pdata$survive_cal_install 0000000180077298 survive_cal.obj + 0005:000022a4 $pdata$survive_cal_light 00000001800772a4 survive_cal.obj + 0005:000022b0 $pdata$vsnprintf 00000001800772b0 survive_cal.obj + 0005:000022bc $pdata$DisambiguatorCharles 00000001800772bc survive_charlesbiguator.obj + 0005:000022c8 $pdata$HandleOOTX 00000001800772c8 survive_charlesbiguator.obj + 0005:000022d4 $pdata$REGISTERDisambiguatorCharles 00000001800772d4 survive_charlesbiguator.obj + 0005:000022e0 $pdata$decode_acode 00000001800772e0 survive_charlesbiguator.obj + 0005:000022ec $pdata$_json_write_float_array 00000001800772ec survive_config.obj + 0005:000022f8 $pdata$config_entry_as_FLT 00000001800772f8 survive_config.obj + 0005:00002304 $pdata$config_entry_as_uint32_t 0000000180077304 survive_config.obj + 0005:00002310 $pdata$config_read 0000000180077310 survive_config.obj + 0005:0000231c $pdata$config_read_float 000000018007731c survive_config.obj + 0005:00002328 $pdata$config_read_float_array 0000000180077328 survive_config.obj + 0005:00002334 $pdata$config_read_lighthouse 0000000180077334 survive_config.obj + 0005:00002340 $pdata$config_read_str 0000000180077340 survive_config.obj + 0005:0000234c $pdata$config_read_uint32 000000018007734c survive_config.obj + 0005:00002358 $pdata$config_save 0000000180077358 survive_config.obj + 0005:00002364 $pdata$config_set_float 0000000180077364 survive_config.obj + 0005:00002370 $pdata$config_set_float_a 0000000180077370 survive_config.obj + 0005:0000237c $pdata$config_set_lighthouse 000000018007737c survive_config.obj + 0005:00002388 $pdata$config_set_str 0000000180077388 survive_config.obj + 0005:00002394 $pdata$config_set_uint32 0000000180077394 survive_config.obj + 0005:000023a0 $pdata$destroy_config_entry 00000001800773a0 survive_config.obj + 0005:000023ac $pdata$destroy_config_group 00000001800773ac survive_config.obj + 0005:000023b8 $pdata$find_config_entry 00000001800773b8 survive_config.obj + 0005:000023c4 $pdata$handle_config_group 00000001800773c4 survive_config.obj + 0005:000023d0 $pdata$handle_tag_value 00000001800773d0 survive_config.obj + 0005:000023dc $pdata$init_config_entry 00000001800773dc survive_config.obj + 0005:000023e8 $pdata$init_config_group 00000001800773e8 survive_config.obj + 0005:000023f4 $pdata$next_unused_entry 00000001800773f4 survive_config.obj + 0005:00002400 $pdata$parse_floats 0000000180077400 survive_config.obj + 0005:0000240c $pdata$parse_uint32 000000018007740c survive_config.obj + 0005:00002418 $pdata$pop_config_group 0000000180077418 survive_config.obj + 0005:00002424 $pdata$print_json_value 0000000180077424 survive_config.obj + 0005:00002430 $pdata$resize_config_group 0000000180077430 survive_config.obj + 0005:0000243c $pdata$sc_search 000000018007743c survive_config.obj + 0005:00002448 $pdata$sstrcpy 0000000180077448 survive_config.obj + 0005:00002454 $pdata$survive_configf 0000000180077454 survive_config.obj + 0005:00002460 $pdata$survive_configi 0000000180077460 survive_config.obj + 0005:0000246c $pdata$survive_configs 000000018007746c survive_config.obj + 0005:00002478 $pdata$write_config_group 0000000180077478 survive_config.obj + 0005:00002484 $pdata$ParsePoints 0000000180077484 survive_default_devices.obj + 0005:00002490 $pdata$jsoneq 0000000180077490 survive_default_devices.obj + 0005:0000249c $pdata$survive_create_device 000000018007749c survive_default_devices.obj + 0005:000024a8 $pdata$survive_create_hmd 00000001800774a8 survive_default_devices.obj + 0005:000024b4 $pdata$survive_create_tr0 00000001800774b4 survive_default_devices.obj + 0005:000024c0 $pdata$survive_create_wm0 00000001800774c0 survive_default_devices.obj + 0005:000024cc $pdata$survive_create_wm1 00000001800774cc survive_default_devices.obj + 0005:000024d8 $pdata$survive_create_ww0 00000001800774d8 survive_default_devices.obj + 0005:000024e4 $pdata$survive_load_htc_config_format 00000001800774e4 survive_default_devices.obj + 0005:000024f0 $pdata$handle_lightcap 00000001800774f0 survive_disambiguator.obj + 0005:000024fc $pdata$GetDriver 00000001800774fc survive_driverman.obj + 0005:00002508 $pdata$GetDriverNameMatching 0000000180077508 survive_driverman.obj + 0005:00002514 $pdata$ListDrivers 0000000180077514 survive_driverman.obj + 0005:00002520 $pdata$RegisterDriver 0000000180077520 survive_driverman.obj + 0005:0000252c $pdata$DriverRegPlayback 000000018007752c survive_playback.obj + 0005:00002538 $pdata$REGISTERDriverRegPlayback 0000000180077538 survive_playback.obj + 0005:00002544 $pdata$__local_stdio_scanf_options 0000000180077544 survive_playback.obj + 0005:00002550 $pdata$_vsscanf_l 0000000180077550 survive_playback.obj + 0005:0000255c $pdata$parse_and_run_imu 000000018007755c survive_playback.obj + 0005:00002568 $pdata$parse_and_run_lightcode 0000000180077568 survive_playback.obj + 0005:00002574 $pdata$parse_and_run_rawlight 0000000180077574 survive_playback.obj + 0005:00002580 $pdata$playback_close 0000000180077580 survive_playback.obj + 0005:0000258c $pdata$playback_poll 000000018007758c survive_playback.obj + 0005:00002598 $pdata$sscanf 0000000180077598 survive_playback.obj + 0005:000025a4 $pdata$survive_install_recording 00000001800775a4 survive_playback.obj + 0005:000025b0 $pdata$survive_recording_angle_process 00000001800775b0 survive_playback.obj + 0005:000025bc $pdata$survive_recording_config_process 00000001800775bc survive_playback.obj + 0005:000025c8 $pdata$survive_recording_imu_process 00000001800775c8 survive_playback.obj + 0005:000025d4 $pdata$survive_recording_info_process 00000001800775d4 survive_playback.obj + 0005:000025e0 $pdata$survive_recording_light_process 00000001800775e0 survive_playback.obj + 0005:000025ec $pdata$survive_recording_lightcap 00000001800775ec survive_playback.obj + 0005:000025f8 $pdata$survive_recording_lighthouse_process 00000001800775f8 survive_playback.obj + 0005:00002604 $pdata$survive_recording_raw_pose_process 0000000180077604 survive_playback.obj + 0005:00002610 $pdata$timestamp_in_us 0000000180077610 survive_playback.obj + 0005:0000261c $pdata$vfprintf 000000018007761c survive_playback.obj + 0005:00002628 $pdata$write_to_output 0000000180077628 survive_playback.obj + 0005:00002634 $pdata$survive_default_angle_process 0000000180077634 survive_process.obj + 0005:00002640 $pdata$survive_default_button_process 0000000180077640 survive_process.obj + 0005:0000264c $pdata$survive_default_htc_config_process 000000018007764c survive_process.obj + 0005:00002658 $pdata$survive_default_imu_process 0000000180077658 survive_process.obj + 0005:00002664 $pdata$survive_default_light_process 0000000180077664 survive_process.obj + 0005:00002670 $pdata$survive_default_lighthouse_pose_process 0000000180077670 survive_process.obj + 0005:0000267c $pdata$survive_default_raw_pose_process 000000018007767c survive_process.obj + 0005:00002688 $pdata$gibf 0000000180077688 survive_reproject.obj + 0005:00002694 $pdata$survive_calibration_config_create_from_idx 0000000180077694 survive_reproject.obj + 0005:000026a0 $pdata$survive_calibration_config_index 00000001800776a0 survive_reproject.obj + 0005:000026ac $pdata$survive_calibration_config_max_idx 00000001800776ac survive_reproject.obj + 0005:000026b8 $pdata$survive_calibration_default_config 00000001800776b8 survive_reproject.obj + 0005:000026c4 $pdata$survive_calibration_options_config_apply 00000001800776c4 survive_reproject.obj + 0005:000026d0 $pdata$survive_calibration_options_config_normalize 00000001800776d0 survive_reproject.obj + 0005:000026dc $pdata$survive_reproject 00000001800776dc survive_reproject.obj + 0005:000026e8 $pdata$survive_reproject_from_pose 00000001800776e8 survive_reproject.obj + 0005:000026f4 $pdata$survive_reproject_from_pose_with_config 00000001800776f4 survive_reproject.obj + 0005:00002700 $pdata$SurviveSensorActivations_add 0000000180077700 survive_sensor_activations.obj + 0005:0000270c $pdata$SurviveSensorActivations_add_imu 000000018007770c survive_sensor_activations.obj + 0005:00002718 $pdata$SurviveSensorActivations_isPairValid 0000000180077718 survive_sensor_activations.obj + 0005:00002724 $pdata$DisambiguatorTurvey 0000000180077724 survive_turveybiguator.obj + 0005:00002730 $pdata$REGISTERDisambiguatorTurvey 0000000180077730 survive_turveybiguator.obj + 0005:0000273c $pdata$handle_lightcap2_getAcodeFromSyncPulse 000000018007773c survive_turveybiguator.obj + 0005:00002748 $pdata$handle_lightcap2_process_sweep_data 0000000180077748 survive_turveybiguator.obj + 0005:00002754 $pdata$handle_lightcap2_sweep 0000000180077754 survive_turveybiguator.obj + 0005:00002760 $pdata$handle_lightcap2_sync 0000000180077760 survive_turveybiguator.obj + 0005:0000276c $pdata$remove_outliers 000000018007776c survive_turveybiguator.obj + 0005:00002778 $pdata$AttachInterface 0000000180077778 survive_vive.obj + 0005:00002784 $pdata$DriverRegHTCVive 0000000180077784 survive_vive.obj + 0005:00002790 $pdata$HAPIReceiver 0000000180077790 survive_vive.obj + 0005:0000279c $pdata$LoadConfig 000000018007779c survive_vive.obj + 0005:000027a8 $pdata$REGISTERDriverRegHTCVive 00000001800777a8 survive_vive.obj + 0005:000027b4 $pdata$_vfwprintf_l 00000001800777b4 survive_vive.obj + 0005:000027c0 $pdata$calibrate_acc 00000001800777c0 survive_vive.obj + 0005:000027cc $pdata$calibrate_gyro 00000001800777cc survive_vive.obj + 0005:000027d8 $pdata$getupdate_feature_report 00000001800777d8 survive_vive.obj + 0005:000027e4 $pdata$handle_watchman 00000001800777e4 survive_vive.obj + 0005:000027f0 $pdata$hid_get_feature_report_timeout 00000001800777f0 survive_vive.obj + 0005:000027fc $pdata$incrementAndPostButtonQueue 00000001800777fc survive_vive.obj + 0005:00002808 $pdata$init_SurviveObject 0000000180077808 survive_vive.obj + 0005:00002814 $pdata$registerButtonEvent 0000000180077814 survive_vive.obj + 0005:00002820 $pdata$survive_data_cb 0000000180077820 survive_vive.obj + 0005:0000282c $pdata$survive_get_config 000000018007782c survive_vive.obj + 0005:00002838 $pdata$survive_usb_init 0000000180077838 survive_vive.obj + 0005:00002844 $pdata$survive_vive_close 0000000180077844 survive_vive.obj + 0005:00002850 $pdata$survive_vive_send_haptic 0000000180077850 survive_vive.obj + 0005:0000285c $pdata$survive_vive_send_magic 000000018007785c survive_vive.obj + 0005:00002868 $pdata$survive_vive_usb_close 0000000180077868 survive_vive.obj + 0005:00002874 $pdata$survive_vive_usb_poll 0000000180077874 survive_vive.obj + 0005:00002880 $pdata$update_feature_report 0000000180077880 survive_vive.obj + 0005:0000288c $pdata$wprintf 000000018007788c survive_vive.obj + 0005:00002898 $pdata$getdelim 0000000180077898 getdelim.obj + 0005:000028a4 $pdata$getline 00000001800778a4 getdelim.obj + 0005:000028b0 $pdata$_RTC_InitBase 00000001800778b0 MSVCRTD:_init_.obj + 0005:000028bc $pdata$_RTC_Shutdown 00000001800778bc MSVCRTD:_init_.obj + 0005:000028c8 $pdata$__raise_securityfailure 00000001800778c8 MSVCRTD:gs_report.obj + 0005:000028d4 $pdata$__report_gsfailure 00000001800778d4 MSVCRTD:gs_report.obj + 0005:000028e0 $pdata$__report_rangecheckfailure 00000001800778e0 MSVCRTD:gs_report.obj + 0005:000028ec $pdata$__report_securityfailure 00000001800778ec MSVCRTD:gs_report.obj + 0005:000028f8 $pdata$__report_securityfailureEx 00000001800778f8 MSVCRTD:gs_report.obj + 0005:00002904 $pdata$capture_current_context 0000000180077904 MSVCRTD:gs_report.obj + 0005:00002910 $pdata$capture_previous_context 0000000180077910 MSVCRTD:gs_report.obj + 0005:0000291c $pdata$_RTC_AllocaHelper 000000018007791c MSVCRTD:_stack_.obj + 0005:00002928 $pdata$0$_RTC_AllocaHelper 0000000180077928 MSVCRTD:_stack_.obj + 0005:00002934 $pdata$1$_RTC_AllocaHelper 0000000180077934 MSVCRTD:_stack_.obj + 0005:00002940 $pdata$_RTC_CheckStackVars 0000000180077940 MSVCRTD:_stack_.obj + 0005:0000294c $pdata$0$_RTC_CheckStackVars 000000018007794c MSVCRTD:_stack_.obj + 0005:00002958 $pdata$1$_RTC_CheckStackVars 0000000180077958 MSVCRTD:_stack_.obj + 0005:00002964 $pdata$_RTC_CheckStackVars2 0000000180077964 MSVCRTD:_stack_.obj + 0005:00002970 $pdata$1$_RTC_CheckStackVars2 0000000180077970 MSVCRTD:_stack_.obj + 0005:0000297c $pdata$2$_RTC_CheckStackVars2 000000018007797c MSVCRTD:_stack_.obj + 0005:00002988 $pdata$3$_RTC_CheckStackVars2 0000000180077988 MSVCRTD:_stack_.obj + 0005:00002994 $pdata$4$_RTC_CheckStackVars2 0000000180077994 MSVCRTD:_stack_.obj + 0005:000029a0 $pdata$5$_RTC_CheckStackVars2 00000001800779a0 MSVCRTD:_stack_.obj + 0005:000029ac $pdata$6$_RTC_CheckStackVars2 00000001800779ac MSVCRTD:_stack_.obj + 0005:000029b8 $pdata$__GSHandlerCheck 00000001800779b8 MSVCRTD:_gshandler_.obj + 0005:000029c4 $pdata$__GSHandlerCheckCommon 00000001800779c4 MSVCRTD:_gshandler_.obj + 0005:000029e8 $pdata$?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 00000001800779e8 MSVCRTD:dll_dllmain.obj + 0005:000029f4 $pdata$?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 00000001800779f4 MSVCRTD:dll_dllmain.obj + 0005:00002a00 $pdata$?dllmain_crt_process_detach@@YAH_N@Z 0000000180077a00 MSVCRTD:dll_dllmain.obj + 0005:00002a0c $pdata$?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180077a0c MSVCRTD:dll_dllmain.obj + 0005:00002a18 $pdata$?dllmain_raw@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180077a18 MSVCRTD:dll_dllmain.obj + 0005:00002a24 $pdata$_CRT_INIT 0000000180077a24 MSVCRTD:dll_dllmain.obj + 0005:00002a30 $pdata$_DllMainCRTStartup 0000000180077a30 MSVCRTD:dll_dllmain.obj + 0005:00002a3c $pdata$?DebuggerProbe@@YA_NK@Z 0000000180077a3c MSVCRTD:_error_.obj + 0005:00002a48 $pdata$?DebuggerRuntime@@YA_NKHPEAXPEB_W@Z 0000000180077a48 MSVCRTD:_error_.obj + 0005:00002a54 $pdata$?_RTC_AllocaFailure@@YAXPEAXPEAU_RTC_ALLOCA_NODE@@H@Z 0000000180077a54 MSVCRTD:_error_.obj + 0005:00002a60 $pdata$0$?_RTC_AllocaFailure@@YAXPEAXPEAU_RTC_ALLOCA_NODE@@H@Z 0000000180077a60 MSVCRTD:_error_.obj + 0005:00002a6c $pdata$1$?_RTC_AllocaFailure@@YAXPEAXPEAU_RTC_ALLOCA_NODE@@H@Z 0000000180077a6c MSVCRTD:_error_.obj + 0005:00002a78 $pdata$?_RTC_StackFailure@@YAXPEAXPEBD@Z 0000000180077a78 MSVCRTD:_error_.obj + 0005:00002a84 $pdata$?_getMemBlockDataString@@YAXPEAD0PEBD_K@Z 0000000180077a84 MSVCRTD:_error_.obj + 0005:00002a90 $pdata$3$?_getMemBlockDataString@@YAXPEAD0PEBD_K@Z 0000000180077a90 MSVCRTD:_error_.obj + 0005:00002a9c $pdata$4$?_getMemBlockDataString@@YAXPEAD0PEBD_K@Z 0000000180077a9c MSVCRTD:_error_.obj + 0005:00002aa8 $pdata$?failwithmessage@@YAXPEAXHHPEBD@Z 0000000180077aa8 MSVCRTD:_error_.obj + 0005:00002ab4 $pdata$?notify_debugger@@YAXAEBUtagEXCEPTION_VISUALCPP_DEBUG_INFO@@@Z 0000000180077ab4 MSVCRTD:_error_.obj + 0005:00002ac0 $pdata$_RTC_UninitUse 0000000180077ac0 MSVCRTD:_error_.obj + 0005:00002acc $pdata$_vsprintf_s_l 0000000180077acc MSVCRTD:_error_.obj + 0005:00002ad8 $pdata$sprintf_s 0000000180077ad8 MSVCRTD:_error_.obj + 0005:00002ae4 $pdata$__get_entropy 0000000180077ae4 MSVCRTD:gs_support.obj + 0005:00002af0 $pdata$__security_init_cookie 0000000180077af0 MSVCRTD:gs_support.obj + 0005:00002afc $pdata$DllMain 0000000180077afc MSVCRTD:dll_dllmain_stub.obj + 0005:00002b08 $pdata$?__scrt_initialize_type_info@@YAXXZ 0000000180077b08 MSVCRTD:tncleanup.obj + 0005:00002b14 $pdata$?__scrt_uninitialize_type_info@@YAXXZ 0000000180077b14 MSVCRTD:tncleanup.obj + 0005:00002b20 $pdata$__scrt_initialize_default_local_stdio_options 0000000180077b20 MSVCRTD:default_local_stdio_options.obj + 0005:00002b2c $pdata$??$__crt_fast_decode_pointer@PEAP6AXXZ@@YAPEAP6AXXZQEAP6AXXZ@Z 0000000180077b2c MSVCRTD:utility.obj + 0005:00002b38 $pdata$??$__crt_fast_encode_pointer@PEAP6AXXZ@@YAPEAP6AXXZQEAP6AXXZ@Z 0000000180077b38 MSVCRTD:utility.obj + 0005:00002b44 $pdata$?configure_argv@__scrt_narrow_argv_policy@@SAHXZ 0000000180077b44 MSVCRTD:utility.obj + 0005:00002b50 $pdata$?find_pe_section@@YAPEAU_IMAGE_SECTION_HEADER@@QEAE_K@Z 0000000180077b50 MSVCRTD:utility.obj + 0005:00002b5c $pdata$?initialize_environment@__scrt_narrow_environment_policy@@SAHXZ 0000000180077b5c MSVCRTD:utility.obj + 0005:00002b68 $pdata$?is_potentially_valid_image_base@@YA_NQEAX@Z 0000000180077b68 MSVCRTD:utility.obj + 0005:00002b74 $pdata$__scrt_acquire_startup_lock 0000000180077b74 MSVCRTD:utility.obj + 0005:00002b80 $pdata$__scrt_dllmain_after_initialize_c 0000000180077b80 MSVCRTD:utility.obj + 0005:00002b8c $pdata$__scrt_dllmain_before_initialize_c 0000000180077b8c MSVCRTD:utility.obj + 0005:00002b98 $pdata$__scrt_dllmain_crt_thread_attach 0000000180077b98 MSVCRTD:utility.obj + 0005:00002ba4 $pdata$__scrt_dllmain_crt_thread_detach 0000000180077ba4 MSVCRTD:utility.obj + 0005:00002bb0 $pdata$__scrt_dllmain_exception_filter 0000000180077bb0 MSVCRTD:utility.obj + 0005:00002bbc $pdata$__scrt_dllmain_uninitialize_c 0000000180077bbc MSVCRTD:utility.obj + 0005:00002bc8 $pdata$__scrt_dllmain_uninitialize_critical 0000000180077bc8 MSVCRTD:utility.obj + 0005:00002bd4 $pdata$__scrt_initialize_crt 0000000180077bd4 MSVCRTD:utility.obj + 0005:00002be0 $pdata$__scrt_initialize_onexit_tables 0000000180077be0 MSVCRTD:utility.obj + 0005:00002bec $pdata$__scrt_is_nonwritable_in_current_image 0000000180077bec MSVCRTD:utility.obj + 0005:00002bf8 $pdata$__scrt_release_startup_lock 0000000180077bf8 MSVCRTD:utility.obj + 0005:00002c04 $pdata$__scrt_uninitialize_crt 0000000180077c04 MSVCRTD:utility.obj + 0005:00002c10 $pdata$_onexit 0000000180077c10 MSVCRTD:utility.obj + 0005:00002c1c $pdata$at_quick_exit 0000000180077c1c MSVCRTD:utility.obj + 0005:00002c28 $pdata$atexit 0000000180077c28 MSVCRTD:utility.obj + 0005:00002c34 $pdata$__scrt_fastfail 0000000180077c34 MSVCRTD:utility_desktop.obj + 0005:00002c40 $pdata$__scrt_get_show_window_mode 0000000180077c40 MSVCRTD:utility_desktop.obj + 0005:00002c4c $pdata$__scrt_is_managed_app 0000000180077c4c MSVCRTD:utility_desktop.obj + 0005:00002c58 $pdata$__scrt_set_unhandled_exception_filter 0000000180077c58 MSVCRTD:utility_desktop.obj + 0005:00002c64 $pdata$__scrt_unhandled_exception_filter 0000000180077c64 MSVCRTD:utility_desktop.obj + 0005:00002c70 $pdata$_RTC_Initialize 0000000180077c70 MSVCRTD:_initsect_.obj + 0005:00002c7c $pdata$0$_RTC_Initialize 0000000180077c7c MSVCRTD:_initsect_.obj + 0005:00002c88 $pdata$1$_RTC_Initialize 0000000180077c88 MSVCRTD:_initsect_.obj + 0005:00002c94 $pdata$_RTC_Terminate 0000000180077c94 MSVCRTD:_initsect_.obj + 0005:00002ca0 $pdata$0$_RTC_Terminate 0000000180077ca0 MSVCRTD:_initsect_.obj + 0005:00002cac $pdata$1$_RTC_Terminate 0000000180077cac MSVCRTD:_initsect_.obj + 0005:00002cb8 $pdata$_guard_check_icall 0000000180077cb8 MSVCRTD:checkcfg.obj + 0005:00002cc4 $pdata$?GetPdbDll@@YAPEAUHINSTANCE__@@XZ 0000000180077cc4 MSVCRTD:_pdblkup_.obj + 0005:00002cd0 $pdata$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180077cd0 MSVCRTD:_pdblkup_.obj + 0005:00002cdc $pdata$0$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180077cdc MSVCRTD:_pdblkup_.obj + 0005:00002ce8 $pdata$1$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180077ce8 MSVCRTD:_pdblkup_.obj + 0005:00002cf4 $pdata$2$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180077cf4 MSVCRTD:_pdblkup_.obj + 0005:00002d00 $pdata$3$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180077d00 MSVCRTD:_pdblkup_.obj + 0005:00002d0c $pdata$4$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180077d0c MSVCRTD:_pdblkup_.obj + 0005:00002d18 $pdata$5$?GetPdbDllFromInstallPath@@YAPEAUHINSTANCE__@@XZ 0000000180077d18 MSVCRTD:_pdblkup_.obj + 0005:00002d24 $pdata$?GetPdbDllPathFromFilePath@@YAHPEB_WPEA_W_K@Z 0000000180077d24 MSVCRTD:_pdblkup_.obj + 0005:00002d30 $pdata$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180077d30 MSVCRTD:_pdblkup_.obj + 0005:00002d3c $pdata$2$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180077d3c MSVCRTD:_pdblkup_.obj + 0005:00002d48 $pdata$3$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180077d48 MSVCRTD:_pdblkup_.obj + 0005:00002d54 $pdata$4$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180077d54 MSVCRTD:_pdblkup_.obj + 0005:00002d60 $pdata$5$?_RTC_GetSrcLine@@YAHPEAEPEA_WKPEAH1K@Z 0000000180077d60 MSVCRTD:_pdblkup_.obj + 0005:00002d6c $pdata$__isa_available_init 0000000180077d6c MSVCRTD:_cpu_disp_.obj + 0005:00002d78 $pdata$__scrt_is_ucrt_dll_in_use 0000000180077d78 MSVCRTD:ucrt_detection.obj + 0005:00002d84 $pdata$ReadNoFence64 0000000180077d84 MSVCRTD:guard_support.obj + 0005:00002d90 $pdata$ReadPointerNoFence 0000000180077d90 MSVCRTD:guard_support.obj + 0005:00002d9c $pdata$_guard_icall_checks_enforced 0000000180077d9c MSVCRTD:guard_support.obj + 0005:00002da8 $pdata$_guard_rf_checks_enforced 0000000180077da8 MSVCRTD:guard_support.obj + 0005:00002df0 $pdata$?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 0000000180077df0 MSVCRTD:dll_dllmain.obj + 0005:00002dfc $pdata$?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 0000000180077dfc MSVCRTD:dll_dllmain.obj + 0005:00002e08 $pdata$?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 0000000180077e08 MSVCRTD:dll_dllmain.obj + 0005:00002e14 $pdata$?filt$0@?0??notify_debugger@@YAXAEBUtagEXCEPTION_VISUALCPP_DEBUG_INFO@@@Z@4HA 0000000180077e14 MSVCRTD:_error_.obj + 0005:00002e20 $pdata$__scrt_is_nonwritable_in_current_image$filt$0 0000000180077e20 MSVCRTD:utility.obj + 0006:00000e58 .idata$6 0000000180079e58 DbgHelp:dbghelp.dll + 0006:00000f1a .idata$6 0000000180079f1a SetupAPI:SETUPAPI.dll + 0006:00001102 .idata$6 000000018007a102 kernel32:KERNEL32.dll + 0006:000011de .idata$6 000000018007a1de vcruntimed:VCRUNTIME140D.dll + 0006:0000155a .idata$6 000000018007a55a ucrtd:ucrtbased.dll + 0008:00000170 $R000000 000000018007c170 * linker generated manifest res * + + Exports + + ordinal name + + 1 REGISTERDisambiguatorCharles + 2 REGISTERDisambiguatorTurvey + 3 REGISTERDriverRegHTCVive + 4 REGISTERDriverRegPlayback + 5 REGISTERPoserCharlesSlow + 6 REGISTERPoserDaveOrtho + 7 REGISTERPoserDummy + 8 REGISTERPoserOctavioRadii + 9 REGISTERPoserTurveyTori + 10 hid_close + 11 hid_enumerate + 12 hid_error + 13 hid_exit + 14 hid_free_enumeration + 15 hid_get_feature_report + 16 hid_get_indexed_string + 17 hid_get_manufacturer_string + 18 hid_get_product_string + 19 hid_get_serial_number_string + 20 hid_init + 21 hid_open + 22 hid_open_path + 23 hid_read + 24 hid_read_timeout + 25 hid_send_feature_report + 26 hid_set_nonblocking + 27 hid_write diff --git a/winbuild/libsurvive/libsurvive.def b/winbuild/libsurvive/libsurvive.def new file mode 100644 index 0000000..86eb377 --- /dev/null +++ b/winbuild/libsurvive/libsurvive.def @@ -0,0 +1,32 @@ +LIBRARY LIBSURVIVE +EXPORTS + survive_verify_FLT_size + survive_init_internal + survive_startup + survive_poll + survive_close + survive_configi + survive_configs + survive_install_light_fn + survive_install_imu_fn + survive_install_angle_fn + survive_send_magic + survive_cal_install + survive_cal_get_status + survive_default_light_process + survive_default_imu_process + survive_default_angle_process + survive_install_button_fn + survive_install_raw_pose_fn + survive_install_lighthouse_pose_fn + survive_get_so_by_name + survive_haptic + survive_default_button_process + survive_default_raw_pose_process + survive_default_lighthouse_pose_process + quatnormalize + quatrotatevector + + OGUSleep + OGGetAbsoluteTime + OGCreateThread diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index ffb89b0..45a684b 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -40,7 +40,7 @@ MultiByte - StaticLibrary + DynamicLibrary true v141 MultiByte @@ -83,6 +83,10 @@ Windows DbgHelp.lib;SetupAPI.lib;%(AdditionalDependencies) + true + $(IntDir)Test.txt + true + $(MSBuildProjectDirectory)\libsurvive.def @@ -187,6 +191,9 @@ + + + diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index 092e27f..ab26bd0 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -153,4 +153,7 @@ Source Files + + + \ No newline at end of file -- cgit v1.2.3 From f73076dd1703601e5e14ab740cd26d29e0b9593d Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 26 Mar 2018 15:16:52 -0600 Subject: Made EPNP actually use both LH --- src/poser_epnp.c | 54 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/poser_epnp.c b/src/poser_epnp.c index c294c0c..632737b 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -98,11 +98,10 @@ static int opencv_solver_fullscene(SurviveObject *so, PoserDataFullScene *pdfs) return 0; } -static void add_correspondences(SurviveObject *so, epnp *pnp, SurviveSensorActivations *scene, - const PoserDataLight *lightData) { - int lh = lightData->lh; +static void add_correspondences(SurviveObject *so, epnp *pnp, SurviveSensorActivations *scene, uint32_t timecode, + int lh) { for (size_t sensor_idx = 0; sensor_idx < so->sensor_ct; sensor_idx++) { - if (SurviveSensorActivations_isPairValid(scene, SurviveSensorActivations_default_tolerance, lightData->timecode, + if (SurviveSensorActivations_isPairValid(scene, SurviveSensorActivations_default_tolerance, timecode, sensor_idx, lh)) { double *angles = scene->angles[sensor_idx][lh]; epnp_add_correspondence(pnp, so->sensor_locations[sensor_idx * 3 + 0], @@ -125,46 +124,55 @@ int PoserEPNP(SurviveObject *so, PoserData *pd) { PoserDataLight *lightData = (PoserDataLight *)pd; SurvivePose posers[2]; - bool hasData[2] = {0, 0}; - for (int lh = 0; lh < 1; lh++) { + int meas[2] = {0, 0}; + for (int lh = 0; lh < 2; lh++) { if (so->ctx->bsd[lh].PositionSet) { epnp pnp = {.fu = 1, .fv = 1}; epnp_set_maximum_number_of_correspondences(&pnp, so->sensor_ct); - add_correspondences(so, &pnp, scene, lightData); + add_correspondences(so, &pnp, scene, lightData->timecode, lh); static int required_meas = -1; if (required_meas == -1) required_meas = survive_configi(so->ctx, "epnp-required-meas", SC_GET, 4); if (pnp.number_of_correspondences > required_meas) { - SurvivePose pose = solve_correspondence(so, &pnp, false); + SurvivePose objInLh = solve_correspondence(so, &pnp, false); + if (quatmagnitude(objInLh.Rot) != 0) { + SurvivePose *lh2world = &so->ctx->bsd[lh].Pose; - SurvivePose txPose = {0}; - quatrotatevector(txPose.Pos, so->ctx->bsd[lh].Pose.Rot, pose.Pos); - for (int i = 0; i < 3; i++) { - txPose.Pos[i] += so->ctx->bsd[lh].Pose.Pos[i]; + SurvivePose txPose = {.Rot = {1}}; + ApplyPoseToPose(&txPose, lh2world, &objInLh); + posers[lh] = txPose; + meas[lh] = pnp.number_of_correspondences; } - - quatrotateabout(txPose.Rot, so->ctx->bsd[lh].Pose.Rot, pose.Rot); - - posers[lh] = txPose; - hasData[lh] = 1; } epnp_dtor(&pnp); } } - if (hasData[0] && hasData[1]) { + if (meas[0] > 0 && meas[1] > 0) { SurvivePose interpolate = {0}; - for (size_t i = 0; i < 3; i++) { - interpolate.Pos[i] = (posers[0].Pos[i] + posers[1].Pos[i]) / 2.; + bool winnerTakesAll = true; // Not convinced slerp does the right thing, will change this when i am + + if (winnerTakesAll) { + int winner = meas[0] > meas[1] ? 0 : 1; + PoserData_poser_raw_pose_func(pd, so, winner, &posers[winner]); + } else { + double a, b; + a = meas[0] * meas[0]; + b = meas[1] * meas[1]; + + double t = a + b; + for (size_t i = 0; i < 3; i++) { + interpolate.Pos[i] = (posers[0].Pos[i] * a + posers[1].Pos[i] * b) / (t); + } + quatslerp(interpolate.Rot, posers[0].Rot, posers[1].Rot, b / (t)); + PoserData_poser_raw_pose_func(pd, so, lightData->lh, &interpolate); } - quatslerp(interpolate.Rot, posers[0].Rot, posers[1].Rot, .5); - PoserData_poser_raw_pose_func(pd, so, lightData->lh, &interpolate); } else { - if (hasData[lightData->lh]) + if (meas[lightData->lh]) PoserData_poser_raw_pose_func(pd, so, lightData->lh, &posers[lightData->lh]); } return 0; -- cgit v1.2.3 From a2eef0e9d90a196f86dece20c6346c55af3bdbc0 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 26 Mar 2018 16:47:11 -0600 Subject: Made SBA and EPNP follow availableLighthouses --- src/poser_epnp.c | 2 +- src/poser_sba.c | 13 +++++++++---- src/survive_process.c | 4 +++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/poser_epnp.c b/src/poser_epnp.c index 632737b..7e86542 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -125,7 +125,7 @@ int PoserEPNP(SurviveObject *so, PoserData *pd) { SurvivePose posers[2]; int meas[2] = {0, 0}; - for (int lh = 0; lh < 2; lh++) { + for (int lh = 0; lh < so->ctx->activeLighthouses; lh++) { if (so->ctx->bsd[lh].PositionSet) { epnp pnp = {.fu = 1, .fv = 1}; epnp_set_maximum_number_of_correspondences(&pnp, so->sensor_ct); diff --git a/src/poser_sba.c b/src/poser_sba.c index 069e1d0..8fa8c08 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -190,6 +190,7 @@ static double run_sba_find_3d_structure_single_sweep(survive_calibration_config size_t meas_size = construct_input_from_scene_single_sweep(so, pdl, scene, vmask, meas, acode, lh); static int failure_count = 500; + if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < d->required_meas) { if (so->ctx->bsd[0].PositionSet && so->ctx->bsd[1].PositionSet && failure_count++ == 500) { SurviveContext *ctx = so->ctx; @@ -284,8 +285,12 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o size_t meas_size = construct_input_from_scene(so, pdl, scene, vmask, meas); static int failure_count = 500; - if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < d->required_meas) { - if (so->ctx->bsd[0].PositionSet && so->ctx->bsd[1].PositionSet && failure_count++ == 500) { + bool hasAllBSDs = true; + for (int lh = 0; lh < so->ctx->activeLighthouses; lh++) + hasAllBSDs &= so->ctx->bsd[lh].PositionSet; + + if (!hasAllBSDs || meas_size < d->required_meas) { + if (hasAllBSDs && failure_count++ == 500) { SurviveContext *ctx = so->ctx; SV_INFO("Can't solve for position with just %u measurements", (unsigned int)meas_size); failure_count = 0; @@ -421,7 +426,7 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd opts[4] = 0.0; int status = sba_mot_levmar(so->sensor_ct, // number of 3d points - NUM_LIGHTHOUSES, // Number of cameras -- 2 lighthouses + so->ctx->activeLighthouses, // Number of cameras -- 2 lighthouses 0, // Number of cameras to not modify vmask, // boolean vis mask (double *)&sbactx.camera_params[0], // camera parameters @@ -439,7 +444,7 @@ static double run_sba(survive_calibration_config options, PoserDataFullScene *pd if (status >= 0) { SurvivePose additionalTx = {0}; - for (int i = 0; i < NUM_LIGHTHOUSES; i++) { + for (int i = 0; i < so->ctx->activeLighthouses; i++) { if (quatmagnitude(sbactx.camera_params[i].Rot) != 0) { PoserData_lighthouse_pose_func(&pdfs->hdr, so, i, &additionalTx, &sbactx.camera_params[i], &sbactx.obj_pose); diff --git a/src/survive_process.c b/src/survive_process.c index 6136148..ad7ce97 100644 --- a/src/survive_process.c +++ b/src/survive_process.c @@ -80,7 +80,9 @@ void survive_default_angle_process( SurviveObject * so, int sensor_id, int acode .lh = lh, }; - SurviveSensorActivations_add(&so->activations, &l); + // Simulate the use of only one lighthouse in playback mode. + if (lh < ctx->activeLighthouses) + SurviveSensorActivations_add(&so->activations, &l); survive_recording_angle_process(so, sensor_id, acode, timecode, length, angle, lh); -- cgit v1.2.3 From f8f9bccc5cafe69d68ff9d3d368d8eaa00edd118 Mon Sep 17 00:00:00 2001 From: CNLohr Date: Mon, 26 Mar 2018 22:03:18 -0400 Subject: Create light_reading.md --- useful_files/light_reading.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 useful_files/light_reading.md diff --git a/useful_files/light_reading.md b/useful_files/light_reading.md new file mode 100644 index 0000000..faafd09 --- /dev/null +++ b/useful_files/light_reading.md @@ -0,0 +1,9 @@ + +Here's an awesome course about VR that gives a ton of background and is great for anyone interested: + +https://stanford.edu/class/ee267/lectures/ + + +Nairol's discussion of the lighthouses used iwth the HTC Vive. + +https://github.com/nairol/LighthouseRedox/tree/master/docs -- cgit v1.2.3 From 494eea066244b42e576b098ffe0fda6fc21c3b86 Mon Sep 17 00:00:00 2001 From: CNLohr Date: Mon, 26 Mar 2018 22:08:16 -0400 Subject: Update light_reading.md --- useful_files/light_reading.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/useful_files/light_reading.md b/useful_files/light_reading.md index faafd09..718b060 100644 --- a/useful_files/light_reading.md +++ b/useful_files/light_reading.md @@ -4,6 +4,6 @@ Here's an awesome course about VR that gives a ton of background and is great fo https://stanford.edu/class/ee267/lectures/ -Nairol's discussion of the lighthouses used iwth the HTC Vive. +Nairol's discussion of the lighthouses used with the HTC Vive. https://github.com/nairol/LighthouseRedox/tree/master/docs -- cgit v1.2.3 From 8ff886d4f48871e9d263b5cfc2a8c842b32690a9 Mon Sep 17 00:00:00 2001 From: CNLohr Date: Mon, 26 Mar 2018 22:14:43 -0400 Subject: Update light_reading.md --- useful_files/light_reading.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/useful_files/light_reading.md b/useful_files/light_reading.md index 718b060..f8613c4 100644 --- a/useful_files/light_reading.md +++ b/useful_files/light_reading.md @@ -1,9 +1,10 @@ Here's an awesome course about VR that gives a ton of background and is great for anyone interested: - https://stanford.edu/class/ee267/lectures/ Nairol's discussion of the lighthouses used with the HTC Vive. - https://github.com/nairol/LighthouseRedox/tree/master/docs + +This is probably what the parameters map to for the lens correction: +https://docs.opencv.org/trunk/db/d58/group__calib3d__fisheye.html -- cgit v1.2.3 From f3877f7b13c4f19ac101a0c6c7d4122a46db9a76 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 26 Mar 2018 12:35:42 -0600 Subject: Initial pass --- Makefile | 4 +- src/survive_tb_disambiguator.c | 143 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 src/survive_tb_disambiguator.c diff --git a/Makefile b/Makefile index f95ca61..e0c5306 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all : lib data_recorder test calibrate calibrate_client simple_pose_test CC?=gcc -CFLAGS:=-Iinclude/libsurvive -fPIC -g -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable +CFLAGS:=-Iinclude/libsurvive -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable CFLAGS_RELEASE:=-Iinclude/libsurvive -fPIC -msse2 -ftree-vectorize -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm @@ -39,7 +39,7 @@ REDISTS:=redist/json_helpers.o redist/linmath.o redist/jsmn.o redist/minimal_ope ifeq ($(UNAME), Darwin) REDISTS:=$(REDISTS) redist/hid-osx.c endif -LIBSURVIVE_CORE:=src/survive.o src/survive_usb.o src/survive_charlesbiguator.o src/survive_process.o src/ootx_decoder.o src/survive_driverman.o src/survive_default_devices.o src/survive_vive.o src/survive_playback.o src/survive_config.o src/survive_cal.o src/survive_reproject.o src/poser.o src/epnp/epnp.c src/survive_sensor_activations.o src/survive_turveybiguator.o src/survive_disambiguator.o +LIBSURVIVE_CORE:=src/survive.o src/survive_usb.o src/survive_charlesbiguator.o src/survive_process.o src/ootx_decoder.o src/survive_driverman.o src/survive_default_devices.o src/survive_vive.o src/survive_playback.o src/survive_config.o src/survive_cal.o src/survive_reproject.o src/poser.o src/epnp/epnp.c src/survive_sensor_activations.o src/survive_turveybiguator.o src/survive_disambiguator.o src/survive_tb_disambiguator.o #If you want to use HIDAPI on Linux. #CFLAGS:=$(CFLAGS) -DHIDAPI diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c new file mode 100644 index 0000000..5d79429 --- /dev/null +++ b/src/survive_tb_disambiguator.c @@ -0,0 +1,143 @@ +// +#include "survive_internal.h" +#include +#include /* for sqrt */ +#include +#include +#include + +#define NUM_HISTORY 3 + +enum LightcapClassification { LCC_UNKNOWN = 0, LCC_SYNC = 1, LCC_SWEEP = 2 }; + +typedef struct { + LightcapElement history[NUM_HISTORY]; + enum LightcapClassification classifications[NUM_HISTORY]; + int idx; +} SensorHistory_t; + +typedef struct { + LightcapElement last_sync; + SensorHistory_t histories[]; +} Disambiguator_data_t; + +Disambiguator_data_t *Disambiguator_data_t_ctor(SurviveObject *so) { + return calloc(sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct, 1); +} + +static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { + if (recent > prior) + return recent - prior; + return (0xFFFFFFFF - prior) + recent; +} + +#define LOWER_SYNC_TIME 2250 +#define UPPER_SYNC_TIME 6750 + +static int circle_buffer_get(int idx, int offset) { return ((idx + offset) + NUM_HISTORY) % NUM_HISTORY; } + +static enum LightcapClassification classify(Disambiguator_data_t *d, SensorHistory_t *history, + const LightcapElement *le) { + bool clearlyNotSync = le->length < LOWER_SYNC_TIME || le->length > UPPER_SYNC_TIME; + + if (clearlyNotSync) { + return LCC_SWEEP; + } + + uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, d->last_sync.timestamp); + uint32_t split_time = 399840; // 8.33ms in 48mhz + uint32_t jitter_allowance = 4000; + + // If we are ~8.33ms ahead of the last sync; we are a sync + if (d->last_sync.length > 0 && time_diff_last_sync < (split_time + jitter_allowance) && + time_diff_last_sync > (split_time - jitter_allowance)) { + return LCC_SYNC; + } + + if (d->last_sync.length > 0 && time_diff_last_sync < (split_time - jitter_allowance)) { + return LCC_SWEEP; + } + + int prevIdx = circle_buffer_get(history->idx, -1); + uint32_t time_diff = timestamp_diff(le->timestamp, history->history[prevIdx].timestamp); + + // We don't have recent data; unclear + if (time_diff > split_time - jitter_allowance) { + fprintf(stderr, "Time diff too high %d\n", time_diff); + return LCC_UNKNOWN; + } + + switch (history->classifications[prevIdx]) { + case LCC_SWEEP: + return LCC_SYNC; + } + fprintf(stderr, "last not sweep\n"); + return LCC_UNKNOWN; +} + +static enum LightcapClassification update_histories(Disambiguator_data_t *d, const LightcapElement *le) { + SensorHistory_t *history = &d->histories[le->sensor_id]; + + enum LightcapClassification classification = classify(d, history, le); + + history->classifications[history->idx] = classification; + history->history[history->idx] = *le; + history->idx = (history->idx + 1) % NUM_HISTORY; + + return classification; +} + +static int find_acode(uint32_t pulseLen) { + const static int offset = 50; + if (pulseLen < 2500 - offset) + return -1; + + if (pulseLen < 3000 + offset) + return 0; + if (pulseLen < 3500 + offset) + return 1; + if (pulseLen < 4000 + offset) + return 2; + if (pulseLen < 4500 + offset) + return 3; + if (pulseLen < 5000 + offset) + return 4; + if (pulseLen < 5500 + offset) + return 5; + if (pulseLen < 6000 + offset) + return 6; + if (pulseLen < 6500 + offset) + return 7; + + return -1; +} + +void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { + SurviveContext *ctx = so->ctx; + if (so->disambiguator_data == NULL) { + SV_INFO("Initializing Disambiguator Data"); + so->disambiguator_data = Disambiguator_data_t_ctor(so); + } + + Disambiguator_data_t *d = so->disambiguator_data; + + SensorHistory_t *history = &d->histories[le->sensor_id]; + int prevIdx = circle_buffer_get(history->idx, -1); + uint32_t time_diff = timestamp_diff(le->timestamp, history->history[prevIdx].timestamp); + enum LightcapClassification classification = update_histories(d, le); + + SV_INFO("Classification %d\t%d\t%d\t%u\t%u(%.02fms)", classification, le->sensor_id, le->length, le->timestamp, + time_diff, (double)time_diff / 48000.0); + if (classification == LCC_SYNC) { + uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, d->last_sync.timestamp); + if (time_diff_last_sync > (0xFFFFFFFF / 2)) + time_diff_last_sync = 0xFFFFFFFFF - time_diff_last_sync; + d->last_sync = *le; + int acode = find_acode(le->length); + SV_INFO("acode: %d 0x%x a:%d d:%d s:%d (%.02fms)", le->length, acode, acode & 1, (bool)(acode & 2), + (bool)(acode & 4), (double)time_diff_last_sync / 48000.); + assert(acode != -1); + } +} + +REGISTER_LINKTIME(DisambiguatorTimeBased); -- cgit v1.2.3 From 3963b2bfe6954bf647d112b2a435910baa5529b2 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 26 Mar 2018 19:22:54 -0600 Subject: Fixed text in menu text --- src/survive.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/survive.c b/src/survive.c index 73d6474..899d206 100644 --- a/src/survive.c +++ b/src/survive.c @@ -219,7 +219,7 @@ void *GetDriverByConfig(SurviveContext *ctx, const char *name, const char *confi int prefixLen = strlen(name); if (verbose > 1) - SV_INFO("Available %s:", name); + SV_INFO("Available %ss:", name); while ((DriverName = GetDriverNameMatching(name, i++))) { void *p = GetDriver(DriverName); @@ -237,7 +237,7 @@ void *GetDriverByConfig(SurviveContext *ctx, const char *name, const char *confi if (verbose > 1) SV_INFO("Totals %d %ss.", i - 1, name); if (verbose > 0) - SV_INFO("Using %s for %s", name, configname); + SV_INFO("Using '%s' for %s", picked, configname); return func; } -- cgit v1.2.3 From 0d10ca10f10a7c16828ae88ebd9a55fde5938efe Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Mon, 26 Mar 2018 23:20:31 -0600 Subject: Added notes before major overhaul --- src/survive_tb_disambiguator.c | 219 ++++++++++++++++++++++++++++++++--------- src/survive_vive.c | 10 -- 2 files changed, 173 insertions(+), 56 deletions(-) diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c index 5d79429..b4dd0ea 100644 --- a/src/survive_tb_disambiguator.c +++ b/src/survive_tb_disambiguator.c @@ -8,6 +8,46 @@ #define NUM_HISTORY 3 +/** + * The lighthouses go in the following order: + * + * Ticks State + * 0 ACode 0b1x0 (4) + * 20 000 ACode 0b0x0 (0) + * LH A X Sweep + * 400 000 ACode 0b1x1 (5) + * 420 000 ACode 0b0x1 (1) + * LH A Y SWEEP + * 800 000 ACode 0b0x0 (0) + * 820 000 ACode 0b1x0 (4) + * LH B X Sweep + * 1 200 000 ACode 0b0x1 (1) + * 1 220 000 ACode 0b1x1 (5) + * LH B Y SWEEP + * 1 600 000 < REPEAT > + * + * NOTE: Obviously you cut the data bit out for this + */ + +enum LighthouseState { + LS_UNKNOWN = 0 + + LS_WaitLHA_ACode4 = 1, + LS_WaitLHA_ACode0, + LS_SweepAX, + LS_WaitLHA_ACode5, + LS_WaitLHA_ACode1, + LS_SweepAY, + LS_WaitLHB_ACode0, + LS_WaitLHB_ACode4, + LS_SweepBX, + LS_WaitLHB_ACode1, + LS_WaitLHB_ACode5, + LS_SweepBY, + + LS_END +}; + enum LightcapClassification { LCC_UNKNOWN = 0, LCC_SYNC = 1, LCC_SWEEP = 2 }; typedef struct { @@ -17,12 +57,19 @@ typedef struct { } SensorHistory_t; typedef struct { - LightcapElement last_sync; + uint64_t last_sync_timestamp; + uint64_t last_sync_length; + int last_sync_count; + bool lastWasSync; + + uint32_t mod_offset; + LighthouseState state; + SensorHistory_t histories[]; } Disambiguator_data_t; Disambiguator_data_t *Disambiguator_data_t_ctor(SurviveObject *so) { - return calloc(sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct, 1); + return calloc(1, sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct); } static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { @@ -31,11 +78,67 @@ static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { return (0xFFFFFFFF - prior) + recent; } +static int find_acode(uint32_t pulseLen) { + const static int offset = 0; + if (pulseLen < 2200 + offset) + return -1; + + if (pulseLen < 3000 + offset) + return 0; + if (pulseLen < 3500 + offset) + return 1; + if (pulseLen < 4000 + offset) + return 2; + if (pulseLen < 4500 + offset) + return 3; + if (pulseLen < 5000 + offset) + return 4; + if (pulseLen < 5500 + offset) + return 5; + if (pulseLen < 6000 + offset) + return 6; + if (pulseLen < 6500 + offset) + return 7; + + return -1; +} + #define LOWER_SYNC_TIME 2250 #define UPPER_SYNC_TIME 6750 static int circle_buffer_get(int idx, int offset) { return ((idx + offset) + NUM_HISTORY) % NUM_HISTORY; } +static bool overlaps(const LightcapElement *a, const LightcapElement *b) { + int overlap = 0; + if (a->timestamp < b->timestamp && a->length + a->timestamp > b->timestamp) + overlap = a->length + a->timestamp - b->timestamp; + else if (b->timestamp < a->timestamp && b->length + b->timestamp > a->timestamp) + overlap = b->length + b->timestamp - a->timestamp; + + return overlap > a->length / 2; +} + +const int SKIP_BIT = 4; +const int DATA_BIT = 2; +const int AXIS_BIT = 1; + +LightcapElement get_last_sync(Disambiguator_data_t *d) { + if (d->last_sync_count == 0) { + return (LightcapElement){0}; + } + + return (LightcapElement){.timestamp = (d->last_sync_timestamp + d->last_sync_count / 2) / d->last_sync_count, + .length = (d->last_sync_length + d->last_sync_count / 2) / d->last_sync_count, + .sensor_id = -d->last_sync_count}; +} + +static uint32_t next_sync_expected(Disambiguator_data_t *d) { + int acode = find_acode(get_last_sync(d).length); + if (acode & SKIP_BIT) + return get_last_sync(d).timestamp + 20000; + return get_last_sync(d).timestamp + 399840; +} + static enum LightcapClassification classify(Disambiguator_data_t *d, SensorHistory_t *history, const LightcapElement *le) { bool clearlyNotSync = le->length < LOWER_SYNC_TIME || le->length > UPPER_SYNC_TIME; @@ -44,17 +147,24 @@ static enum LightcapClassification classify(Disambiguator_data_t *d, SensorHisto return LCC_SWEEP; } - uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, d->last_sync.timestamp); + uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, get_last_sync(d).timestamp); uint32_t split_time = 399840; // 8.33ms in 48mhz - uint32_t jitter_allowance = 4000; + uint32_t jitter_allowance = 20000; // If we are ~8.33ms ahead of the last sync; we are a sync - if (d->last_sync.length > 0 && time_diff_last_sync < (split_time + jitter_allowance) && - time_diff_last_sync > (split_time - jitter_allowance)) { + if (get_last_sync(d).length > 0 && abs(timestamp_diff(le->timestamp, next_sync_expected(d))) < jitter_allowance) { return LCC_SYNC; } - if (d->last_sync.length > 0 && time_diff_last_sync < (split_time - jitter_allowance)) { + LightcapElement last_sync = get_last_sync(d); + if (get_last_sync(d).length > 0 && overlaps(&last_sync, le)) { + return LCC_SYNC; + } + + if (le->length > 2000) + return LCC_SYNC; + + if (get_last_sync(d).length > 0 && time_diff_last_sync < (split_time - jitter_allowance)) { return LCC_SWEEP; } @@ -62,7 +172,7 @@ static enum LightcapClassification classify(Disambiguator_data_t *d, SensorHisto uint32_t time_diff = timestamp_diff(le->timestamp, history->history[prevIdx].timestamp); // We don't have recent data; unclear - if (time_diff > split_time - jitter_allowance) { + if (time_diff > split_time) { fprintf(stderr, "Time diff too high %d\n", time_diff); return LCC_UNKNOWN; } @@ -79,43 +189,22 @@ static enum LightcapClassification update_histories(Disambiguator_data_t *d, con SensorHistory_t *history = &d->histories[le->sensor_id]; enum LightcapClassification classification = classify(d, history, le); - history->classifications[history->idx] = classification; history->history[history->idx] = *le; history->idx = (history->idx + 1) % NUM_HISTORY; - return classification; } -static int find_acode(uint32_t pulseLen) { - const static int offset = 50; - if (pulseLen < 2500 - offset) - return -1; - - if (pulseLen < 3000 + offset) - return 0; - if (pulseLen < 3500 + offset) - return 1; - if (pulseLen < 4000 + offset) - return 2; - if (pulseLen < 4500 + offset) - return 3; - if (pulseLen < 5000 + offset) - return 4; - if (pulseLen < 5500 + offset) - return 5; - if (pulseLen < 6000 + offset) - return 6; - if (pulseLen < 6500 + offset) - return 7; - - return -1; -} - void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { SurviveContext *ctx = so->ctx; + + // Note, this happens if we don't have config yet -- just bail + if (so->sensor_ct == 0) { + return; + } + if (so->disambiguator_data == NULL) { - SV_INFO("Initializing Disambiguator Data"); + SV_INFO("Initializing Disambiguator Data for TB %d", so->sensor_ct); so->disambiguator_data = Disambiguator_data_t_ctor(so); } @@ -126,18 +215,56 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { uint32_t time_diff = timestamp_diff(le->timestamp, history->history[prevIdx].timestamp); enum LightcapClassification classification = update_histories(d, le); - SV_INFO("Classification %d\t%d\t%d\t%u\t%u(%.02fms)", classification, le->sensor_id, le->length, le->timestamp, - time_diff, (double)time_diff / 48000.0); + uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, get_last_sync(d).timestamp); + if (time_diff_last_sync > (0xFFFFFFFF / 2)) + time_diff_last_sync = 0xFFFFFFFFF - time_diff_last_sync; + + LightcapElement lastSync = get_last_sync(d); + int acode = find_acode(lastSync.length); + if (classification == LCC_SYNC) { - uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, d->last_sync.timestamp); - if (time_diff_last_sync > (0xFFFFFFFF / 2)) - time_diff_last_sync = 0xFFFFFFFFF - time_diff_last_sync; - d->last_sync = *le; - int acode = find_acode(le->length); - SV_INFO("acode: %d 0x%x a:%d d:%d s:%d (%.02fms)", le->length, acode, acode & 1, (bool)(acode & 2), - (bool)(acode & 4), (double)time_diff_last_sync / 48000.); - assert(acode != -1); + LightcapElement lastSync = get_last_sync(d); + if (d->lastWasSync == false || overlaps(&lastSync, le) == false) { + + if (lastSync.length) { + int acode = find_acode(lastSync.length); + SV_INFO("%.03f(%d)\tacode: %d 0x%x a:%d d:%d s:%d (%d)", + timestamp_diff(le->timestamp, lastSync.timestamp) / 48000., + timestamp_diff(le->timestamp, lastSync.timestamp), lastSync.length, acode, acode & 1, + (bool)(acode & 2), (bool)(acode & 4), ((acode >> 1) & 0x2) | (acode & 1)); + assert(acode != -1); + } + d->last_sync_timestamp = le->timestamp; + d->last_sync_length = le->length; + d->last_sync_count = 1; + } else { + d->last_sync_timestamp += le->timestamp; + d->last_sync_length += le->length; + d->last_sync_count++; + } + + d->lastWasSync = true; + + lastSync = get_last_sync(d); + // SV_INFO("acode building: %u %u %u", lastSync.length, lastSync.timestamp, lastSync.length + + // lastSync.timestamp); + } else { + if (d->lastWasSync) { + if (lastSync.length) { + int acode = find_acode(lastSync.length); + SV_INFO("start acode: %d 0x%x a:%d d:%d s:%d (%d)", lastSync.length, acode, acode & 1, + (bool)(acode & 2), (bool)(acode & 4), ((acode >> 1) & 0x2) | (acode & 1)); + assert(acode != -1); + } + } + d->lastWasSync = false; } + + if (classification == LCC_SWEEP) + SV_INFO("%.02fms Classification %d\t%d\t%d\t%u\t%u\t(%.02fms)\ttime since last sync: %.02fms a:%d d:%d s:%d", + (double)le->timestamp / 48000, classification, le->sensor_id, le->length, le->timestamp, time_diff, + (double)time_diff / 48000.0, (double)time_diff_last_sync / 48000., acode & 1, (bool)(acode & 2), + (bool)(acode & 4)); } REGISTER_LINKTIME(DisambiguatorTimeBased); diff --git a/src/survive_vive.c b/src/survive_vive.c index 91f25af..3c60b2a 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -1708,16 +1708,6 @@ int survive_vive_close( SurviveContext * ctx, void * driver ) return 0; } -void init_SurviveObject(SurviveObject* so) { - so->acc_scale = NULL; - so->acc_bias = NULL; - so->gyro_scale = NULL; - so->gyro_bias = NULL; - so->haptic = NULL; - so->PoserData = NULL; - so->disambiguator_data = NULL; -} - int DriverRegHTCVive( SurviveContext * ctx ) { const char *playback_dir = survive_configs(ctx, "playback", SC_GET, ""); -- cgit v1.2.3 From 0a4722c50ddfe12e59aba9c79ec1988f9b82f997 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Tue, 27 Mar 2018 00:16:13 -0600 Subject: Find state works well --- src/survive_tb_disambiguator.c | 166 ++++++++++++++++++++++++++++------------- 1 file changed, 114 insertions(+), 52 deletions(-) diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c index b4dd0ea..dda55ff 100644 --- a/src/survive_tb_disambiguator.c +++ b/src/survive_tb_disambiguator.c @@ -30,7 +30,7 @@ */ enum LighthouseState { - LS_UNKNOWN = 0 + LS_UNKNOWN = 0, LS_WaitLHA_ACode4 = 1, LS_WaitLHA_ACode0, @@ -48,6 +48,40 @@ enum LighthouseState { LS_END }; +int LighthouseState_offset(enum LighthouseState s) { + int mini_jump = 20000; + int big_jump = 360000; + switch (s) { + case LS_WaitLHA_ACode4: + return 0; + case LS_WaitLHA_ACode0: + return mini_jump; + case LS_SweepAX: + return 2 * mini_jump; + case LS_WaitLHA_ACode5: + return 2 * mini_jump + big_jump; + case LS_WaitLHA_ACode1: + return 3 * mini_jump + big_jump; + case LS_SweepAY: + return 4 * mini_jump + big_jump; + case LS_WaitLHB_ACode0: + return 4 * mini_jump + 2 * big_jump; + case LS_WaitLHB_ACode4: + return 5 * mini_jump + 2 * big_jump; + case LS_SweepBX: + return 6 * mini_jump + 2 * big_jump; + case LS_WaitLHB_ACode1: + return 6 * mini_jump + 3 * big_jump; + case LS_WaitLHB_ACode5: + return 7 * mini_jump + 3 * big_jump; + case LS_SweepBY: + return 8 * mini_jump + 3 * big_jump; + case LS_END: + return 8 * mini_jump + 4 * big_jump; + } + return -1; +} + enum LightcapClassification { LCC_UNKNOWN = 0, LCC_SYNC = 1, LCC_SWEEP = 2 }; typedef struct { @@ -57,19 +91,30 @@ typedef struct { } SensorHistory_t; typedef struct { + SurviveObject *so; + /** This part of the structure is general use when we know our state */ + uint32_t mod_offset; + enum LighthouseState state; + int confidence; + + /** This rest of the structure is dedicated to finding a state when we are unknown */ + + int encoded_acodes; + /* Keep running average of sync signals as they come in */ uint64_t last_sync_timestamp; uint64_t last_sync_length; int last_sync_count; - bool lastWasSync; - - uint32_t mod_offset; - LighthouseState state; + bool lastWasSync; SensorHistory_t histories[]; + } Disambiguator_data_t; Disambiguator_data_t *Disambiguator_data_t_ctor(SurviveObject *so) { - return calloc(1, sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct); + Disambiguator_data_t *rtn = calloc(1, sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct); + rtn->so = so; + + return rtn; } static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { @@ -195,45 +240,48 @@ static enum LightcapClassification update_histories(Disambiguator_data_t *d, con return classification; } -void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { - SurviveContext *ctx = so->ctx; - - // Note, this happens if we don't have config yet -- just bail - if (so->sensor_ct == 0) { - return; - } +static enum LighthouseState EndSync(Disambiguator_data_t *d, const LightcapElement *le) { + SurviveContext *ctx = d->so->ctx; + LightcapElement lastSync = get_last_sync(d); + int acode = find_acode(lastSync.length); + SV_INFO("!!%.03f(%d)\tacode: %d 0x%x a:%d d:%d s:%d (%d)", + timestamp_diff(le->timestamp, lastSync.timestamp) / 48000., + timestamp_diff(le->timestamp, lastSync.timestamp), lastSync.length, acode, acode & 1, (bool)(acode & 2), + (bool)(acode & 4), acode & (SKIP_BIT | AXIS_BIT)); + + if (acode > 0) { + d->encoded_acodes &= 0xFFFF; + d->encoded_acodes = (d->encoded_acodes << 8) | (acode & (SKIP_BIT | AXIS_BIT)); + SV_INFO("%x", d->encoded_acodes); + switch (d->encoded_acodes) { + case (5 << 16) | (4 << 8) | 0: + return d->state = LS_SweepAX - 1; + case (0 << 16) | (5 << 8) | 1: + return d->state = LS_SweepAY - 1; + case (1 << 16) | (0 << 8) | 4: + return d->state = LS_SweepBX - 1; + case (4 << 16) | (1 << 8) | 5: + return d->state = LS_SweepBY - 1; + } - if (so->disambiguator_data == NULL) { - SV_INFO("Initializing Disambiguator Data for TB %d", so->sensor_ct); - so->disambiguator_data = Disambiguator_data_t_ctor(so); + } else { + d->encoded_acodes = 0; } - Disambiguator_data_t *d = so->disambiguator_data; + return LS_UNKNOWN; +} - SensorHistory_t *history = &d->histories[le->sensor_id]; - int prevIdx = circle_buffer_get(history->idx, -1); - uint32_t time_diff = timestamp_diff(le->timestamp, history->history[prevIdx].timestamp); +static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const LightcapElement *le) { enum LightcapClassification classification = update_histories(d, le); - uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, get_last_sync(d).timestamp); - if (time_diff_last_sync > (0xFFFFFFFF / 2)) - time_diff_last_sync = 0xFFFFFFFFF - time_diff_last_sync; - - LightcapElement lastSync = get_last_sync(d); - int acode = find_acode(lastSync.length); - if (classification == LCC_SYNC) { LightcapElement lastSync = get_last_sync(d); + if (d->lastWasSync == false || overlaps(&lastSync, le) == false) { + enum LighthouseState new_state = EndSync(d, le); + if (new_state != LS_UNKNOWN) + return new_state; - if (lastSync.length) { - int acode = find_acode(lastSync.length); - SV_INFO("%.03f(%d)\tacode: %d 0x%x a:%d d:%d s:%d (%d)", - timestamp_diff(le->timestamp, lastSync.timestamp) / 48000., - timestamp_diff(le->timestamp, lastSync.timestamp), lastSync.length, acode, acode & 1, - (bool)(acode & 2), (bool)(acode & 4), ((acode >> 1) & 0x2) | (acode & 1)); - assert(acode != -1); - } d->last_sync_timestamp = le->timestamp; d->last_sync_length = le->length; d->last_sync_count = 1; @@ -244,27 +292,41 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { } d->lastWasSync = true; - - lastSync = get_last_sync(d); - // SV_INFO("acode building: %u %u %u", lastSync.length, lastSync.timestamp, lastSync.length + - // lastSync.timestamp); } else { - if (d->lastWasSync) { - if (lastSync.length) { - int acode = find_acode(lastSync.length); - SV_INFO("start acode: %d 0x%x a:%d d:%d s:%d (%d)", lastSync.length, acode, acode & 1, - (bool)(acode & 2), (bool)(acode & 4), ((acode >> 1) & 0x2) | (acode & 1)); - assert(acode != -1); - } - } d->lastWasSync = false; } - if (classification == LCC_SWEEP) - SV_INFO("%.02fms Classification %d\t%d\t%d\t%u\t%u\t(%.02fms)\ttime since last sync: %.02fms a:%d d:%d s:%d", - (double)le->timestamp / 48000, classification, le->sensor_id, le->length, le->timestamp, time_diff, - (double)time_diff / 48000.0, (double)time_diff_last_sync / 48000., acode & 1, (bool)(acode & 2), - (bool)(acode & 4)); + return LS_UNKNOWN; +} + +void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { d->state = LS_UNKNOWN; } + +void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { + SurviveContext *ctx = so->ctx; + + // Note, this happens if we don't have config yet -- just bail + if (so->sensor_ct == 0) { + return; + } + + if (so->disambiguator_data == NULL) { + SV_INFO("Initializing Disambiguator Data for TB %d", so->sensor_ct); + so->disambiguator_data = Disambiguator_data_t_ctor(so); + } + + Disambiguator_data_t *d = so->disambiguator_data; + + if (d->state == LS_UNKNOWN) { + enum LighthouseState new_state = AttemptFindState(d, le); + if (new_state != LS_UNKNOWN) { + d->confidence = 0; + d->mod_offset = (le->timestamp % LighthouseState_offset(LS_END)) - LighthouseState_offset(new_state); + d->state = new_state; + SV_INFO("Locked onto state %d at %d", new_state, d->mod_offset); + } + } else { + PropagateState(d, le); + } } REGISTER_LINKTIME(DisambiguatorTimeBased); -- cgit v1.2.3 From 0ff8f72a30a4c659815696074f672569d02e7718 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Tue, 27 Mar 2018 08:15:39 -0600 Subject: State machine sorta works; but times are backwards?! --- src/survive_tb_disambiguator.c | 112 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 4 deletions(-) diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c index dda55ff..e09d3da 100644 --- a/src/survive_tb_disambiguator.c +++ b/src/survive_tb_disambiguator.c @@ -29,6 +29,10 @@ * NOTE: Obviously you cut the data bit out for this */ +// Every pulse_window seems roughly 20k ticks long. That leaves ~360 to the capture window +#define PULSE_WINDOW 20000 +#define CAPTURE_WINDOW 360000 + enum LighthouseState { LS_UNKNOWN = 0, @@ -48,6 +52,63 @@ enum LighthouseState { LS_END }; +void LighthouseState_Parameterize(enum LighthouseState s, int *acode, int *lh, int *axis, int *window) { + *lh = *axis = *acode = -1; + switch (s) { + case LS_WaitLHB_ACode4: + case LS_WaitLHA_ACode4: + case LS_WaitLHB_ACode0: + case LS_WaitLHA_ACode0: + case LS_WaitLHB_ACode5: + case LS_WaitLHA_ACode5: + case LS_WaitLHB_ACode1: + case LS_WaitLHA_ACode1: + *window = PULSE_WINDOW; + break; + case LS_SweepAX: + case LS_SweepAY: + case LS_SweepBX: + case LS_SweepBY: + *window = CAPTURE_WINDOW; + break; + } + + switch (s) { + case LS_WaitLHB_ACode4: + case LS_WaitLHA_ACode4: + *acode = 4; + break; + case LS_WaitLHB_ACode0: + case LS_WaitLHA_ACode0: + *acode = 0; + break; + case LS_WaitLHB_ACode5: + case LS_WaitLHA_ACode5: + *acode = 5; + break; + case LS_WaitLHB_ACode1: + case LS_WaitLHA_ACode1: + *acode = 1; + break; + case LS_SweepAX: + *axis = 0; + *lh = 0; + break; + case LS_SweepAY: + *axis = 1; + *lh = 0; + break; + case LS_SweepBX: + *axis = 0; + *lh = 1; + break; + case LS_SweepBY: + *axis = 1; + *lh = 1; + break; + } +} + int LighthouseState_offset(enum LighthouseState s) { int mini_jump = 20000; int big_jump = 360000; @@ -95,8 +156,9 @@ typedef struct { /** This part of the structure is general use when we know our state */ uint32_t mod_offset; enum LighthouseState state; + uint32_t last_state_transition_time; int confidence; - + uint32_t last_seen_time; /** This rest of the structure is dedicated to finding a state when we are unknown */ int encoded_acodes; @@ -299,7 +361,47 @@ static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const Ligh return LS_UNKNOWN; } -void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { d->state = LS_UNKNOWN; } +static void SetState(Disambiguator_data_t *d, const LightcapElement *le, enum LighthouseState new_state) { + + SurviveContext *ctx = d->so->ctx; + SV_INFO("State transition %d -> %d at %u(%.03f)", d->state, new_state, le->timestamp, + timestamp_diff(d->last_state_transition_time, le->timestamp) / 480000.); + + d->state = new_state; + if (d->state >= LS_END) + d->state = 1; + d->last_state_transition_time = le->timestamp; +} + +static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le); +static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const LightcapElement *le) { + int acode = find_acode(le->length); + SurviveContext *ctx = d->so->ctx; + + SV_INFO("acode %d %d 0x%x", target_acode, le->length, acode); + + if (target_acode != (acode & (SKIP_BIT | AXIS_BIT))) + SetState(d, le, LS_UNKNOWN); +} + +static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { + int acode, lh, axis, window; + LighthouseState_Parameterize(d->state, &acode, &lh, &axis, &window); + + SurviveContext *ctx = d->so->ctx; + SV_INFO("param %u %d %d %d", le->timestamp, acode, le->length, window + d->last_state_transition_time); + + if (le->timestamp < d->last_state_transition_time + window) { + if (acode != -1) { + RunACodeCapture(acode, d, le); + } else { + // RunLightDataCapture(lh, axis, d, le); + } + } else { + SetState(d, le, d->state + 1); + PropagateState(d, le); + } +} void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { SurviveContext *ctx = so->ctx; @@ -315,14 +417,16 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { } Disambiguator_data_t *d = so->disambiguator_data; + assert(d->last_seen_time < le->timestamp || d->last_seen_time - le->timestamp > 0x8FFFFFFF); + d->last_seen_time = le->timestamp; if (d->state == LS_UNKNOWN) { enum LighthouseState new_state = AttemptFindState(d, le); if (new_state != LS_UNKNOWN) { d->confidence = 0; d->mod_offset = (le->timestamp % LighthouseState_offset(LS_END)) - LighthouseState_offset(new_state); - d->state = new_state; - SV_INFO("Locked onto state %d at %d", new_state, d->mod_offset); + SetState(d, le, new_state); + SV_INFO("Locked onto state %d at %u", new_state, d->mod_offset); } } else { PropagateState(d, le); -- cgit v1.2.3 From 7bff842d6f01ea3a855d478734212ae0379f58e4 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Tue, 27 Mar 2018 08:53:20 -0600 Subject: Made state finder tolerant to one lh --- src/survive_tb_disambiguator.c | 79 +++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c index e09d3da..86cc1d3 100644 --- a/src/survive_tb_disambiguator.c +++ b/src/survive_tb_disambiguator.c @@ -12,17 +12,17 @@ * The lighthouses go in the following order: * * Ticks State - * 0 ACode 0b1x0 (4) - * 20 000 ACode 0b0x0 (0) + * 0 ACode 0b1x0 (4) <--- B + * 20 000 ACode 0b0x0 (0) <--- A/c * LH A X Sweep - * 400 000 ACode 0b1x1 (5) - * 420 000 ACode 0b0x1 (1) + * 400 000 ACode 0b1x1 (5) <--- B + * 420 000 ACode 0b0x1 (1) <--- A/c * LH A Y SWEEP - * 800 000 ACode 0b0x0 (0) - * 820 000 ACode 0b1x0 (4) + * 800 000 ACode 0b0x0 (0) <--- B + * 820 000 ACode 0b1x0 (4) <--- A/c * LH B X Sweep - * 1 200 000 ACode 0b0x1 (1) - * 1 220 000 ACode 0b1x1 (5) + * 1 200 000 ACode 0b0x1 (1) <--- B + * 1 220 000 ACode 0b1x1 (5) <--- A/c * LH B Y SWEEP * 1 600 000 < REPEAT > * @@ -302,6 +302,31 @@ static enum LightcapClassification update_histories(Disambiguator_data_t *d, con return classification; } +#define ACODE(s, d, a) ((s << 2) | (d << 1) | a) +#define SWEEP 0xFF + +static enum LighthouseState CheckEncodedAcode(Disambiguator_data_t *d, uint8_t newByte) { + SurviveContext *ctx = d->so->ctx; + d->encoded_acodes &= 0xFF; + d->encoded_acodes = (d->encoded_acodes << 8) | newByte; //(acode & (SKIP_BIT | AXIS_BIT)); + SV_INFO("0x%x", d->encoded_acodes); + + switch (d->encoded_acodes) { + case (ACODE(0, 1, 0) << 8) | SWEEP: + return LS_SweepAX + 1; + case (ACODE(0, 1, 1) << 8) | SWEEP: + return LS_SweepAY + 1; + case (SWEEP << 8) | (ACODE(0, 1, 1)): + return LS_SweepBX + 1; + case (SWEEP << 8) | (ACODE(1, 1, 0)): + return LS_SweepBY + 1; + } + + return LS_UNKNOWN; +} +static enum LighthouseState EndSweep(Disambiguator_data_t *d, const LightcapElement *le) { + return CheckEncodedAcode(d, SWEEP); +} static enum LighthouseState EndSync(Disambiguator_data_t *d, const LightcapElement *le) { SurviveContext *ctx = d->so->ctx; LightcapElement lastSync = get_last_sync(d); @@ -312,24 +337,10 @@ static enum LighthouseState EndSync(Disambiguator_data_t *d, const LightcapEleme (bool)(acode & 4), acode & (SKIP_BIT | AXIS_BIT)); if (acode > 0) { - d->encoded_acodes &= 0xFFFF; - d->encoded_acodes = (d->encoded_acodes << 8) | (acode & (SKIP_BIT | AXIS_BIT)); - SV_INFO("%x", d->encoded_acodes); - switch (d->encoded_acodes) { - case (5 << 16) | (4 << 8) | 0: - return d->state = LS_SweepAX - 1; - case (0 << 16) | (5 << 8) | 1: - return d->state = LS_SweepAY - 1; - case (1 << 16) | (0 << 8) | 4: - return d->state = LS_SweepBX - 1; - case (4 << 16) | (1 << 8) | 5: - return d->state = LS_SweepBY - 1; - } - + return CheckEncodedAcode(d, (acode | DATA_BIT)); } else { d->encoded_acodes = 0; } - return LS_UNKNOWN; } @@ -340,9 +351,17 @@ static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const Ligh LightcapElement lastSync = get_last_sync(d); if (d->lastWasSync == false || overlaps(&lastSync, le) == false) { - enum LighthouseState new_state = EndSync(d, le); - if (new_state != LS_UNKNOWN) - return new_state; + if (d->lastWasSync && timestamp_diff(lastSync.timestamp, le->timestamp) > 30000) { + // Missed a sweep window; clear encoded values. + d->encoded_acodes = 0; + } + + enum LighthouseState new_state = d->lastWasSync ? EndSync(d, le) : EndSweep(d, le); + + if (new_state != LS_UNKNOWN) { + fprintf(stderr, "new state: %d\n", new_state); + } + // return new_state; d->last_sync_timestamp = le->timestamp; d->last_sync_length = le->length; @@ -355,6 +374,10 @@ static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const Ligh d->lastWasSync = true; } else { + if (d->lastWasSync) { + enum LighthouseState new_state = EndSync(d, le); + fprintf(stderr, "Sweep start\n\n"); + } d->lastWasSync = false; } @@ -417,7 +440,7 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { } Disambiguator_data_t *d = so->disambiguator_data; - assert(d->last_seen_time < le->timestamp || d->last_seen_time - le->timestamp > 0x8FFFFFFF); + // assert(d->last_seen_time < le->timestamp || d->last_seen_time - le->timestamp > 0x8FFFFFFF); d->last_seen_time = le->timestamp; if (d->state == LS_UNKNOWN) { @@ -425,7 +448,7 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { if (new_state != LS_UNKNOWN) { d->confidence = 0; d->mod_offset = (le->timestamp % LighthouseState_offset(LS_END)) - LighthouseState_offset(new_state); - SetState(d, le, new_state); + // SetState(d, le, new_state); SV_INFO("Locked onto state %d at %u", new_state, d->mod_offset); } } else { -- cgit v1.2.3 From d292e120dc997b4dad8d6d8a10ed86045a5f3e94 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Tue, 27 Mar 2018 16:20:41 -0600 Subject: More or less works, just doesn't output --- src/survive_tb_disambiguator.c | 298 ++++++++++++++++++++++++----------------- 1 file changed, 172 insertions(+), 126 deletions(-) diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c index 86cc1d3..8bb4617 100644 --- a/src/survive_tb_disambiguator.c +++ b/src/survive_tb_disambiguator.c @@ -8,6 +8,8 @@ #define NUM_HISTORY 3 +//#define DEBUG_TB(...) SV_INFO(__VA_ARGS__) +#define DEBUG_TB(...) /** * The lighthouses go in the following order: * @@ -52,94 +54,60 @@ enum LighthouseState { LS_END }; -void LighthouseState_Parameterize(enum LighthouseState s, int *acode, int *lh, int *axis, int *window) { - *lh = *axis = *acode = -1; - switch (s) { - case LS_WaitLHB_ACode4: - case LS_WaitLHA_ACode4: - case LS_WaitLHB_ACode0: - case LS_WaitLHA_ACode0: - case LS_WaitLHB_ACode5: - case LS_WaitLHA_ACode5: - case LS_WaitLHB_ACode1: - case LS_WaitLHA_ACode1: - *window = PULSE_WINDOW; - break; - case LS_SweepAX: - case LS_SweepAY: - case LS_SweepBX: - case LS_SweepBY: - *window = CAPTURE_WINDOW; - break; - } - - switch (s) { - case LS_WaitLHB_ACode4: - case LS_WaitLHA_ACode4: - *acode = 4; - break; - case LS_WaitLHB_ACode0: - case LS_WaitLHA_ACode0: - *acode = 0; - break; - case LS_WaitLHB_ACode5: - case LS_WaitLHA_ACode5: - *acode = 5; - break; - case LS_WaitLHB_ACode1: - case LS_WaitLHA_ACode1: - *acode = 1; - break; - case LS_SweepAX: - *axis = 0; - *lh = 0; - break; - case LS_SweepAY: - *axis = 1; - *lh = 0; - break; - case LS_SweepBX: - *axis = 0; - *lh = 1; - break; - case LS_SweepBY: - *axis = 1; - *lh = 1; - break; - } -} +typedef struct { int acode, lh, axis, window, offset; } LighthouseStateParameters; + +const LighthouseStateParameters LS_Params[LS_END + 1] = { + {.acode = -1, .lh = -1, .axis = -1, .window = -1}, + + {.acode = 4, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 0 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 0 + {.acode = 0, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 1 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 20000 + {.acode = -1, + .lh = 0, + .axis = 0, + .window = CAPTURE_WINDOW, + .offset = 2 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 40000 + + {.acode = 5, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 2 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 400000 + {.acode = 1, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 3 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 420000 + {.acode = -1, + .lh = 0, + .axis = 1, + .window = CAPTURE_WINDOW, + .offset = 4 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 440000 + + {.acode = 0, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 4 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 800000 + {.acode = 4, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 5 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 820000 + {.acode = -1, + .lh = 1, + .axis = 0, + .window = CAPTURE_WINDOW, + .offset = 6 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 840000 + + {.acode = 1, + .lh = 1, + .axis = 1, + .window = PULSE_WINDOW, + .offset = 6 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1200000 + {.acode = 5, + .lh = 0, + .axis = 1, + .window = PULSE_WINDOW, + .offset = 7 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1220000 + {.acode = -1, + .lh = 1, + .axis = 1, + .window = CAPTURE_WINDOW, + .offset = 8 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1240000 + + {.acode = -1, .lh = -1, .axis = -1, .window = -1, .offset = 8 * PULSE_WINDOW + 4 * CAPTURE_WINDOW} // 1600000 +}; -int LighthouseState_offset(enum LighthouseState s) { - int mini_jump = 20000; - int big_jump = 360000; - switch (s) { - case LS_WaitLHA_ACode4: - return 0; - case LS_WaitLHA_ACode0: - return mini_jump; - case LS_SweepAX: - return 2 * mini_jump; - case LS_WaitLHA_ACode5: - return 2 * mini_jump + big_jump; - case LS_WaitLHA_ACode1: - return 3 * mini_jump + big_jump; - case LS_SweepAY: - return 4 * mini_jump + big_jump; - case LS_WaitLHB_ACode0: - return 4 * mini_jump + 2 * big_jump; - case LS_WaitLHB_ACode4: - return 5 * mini_jump + 2 * big_jump; - case LS_SweepBX: - return 6 * mini_jump + 2 * big_jump; - case LS_WaitLHB_ACode1: - return 6 * mini_jump + 3 * big_jump; - case LS_WaitLHB_ACode5: - return 7 * mini_jump + 3 * big_jump; - case LS_SweepBY: - return 8 * mini_jump + 3 * big_jump; - case LS_END: - return 8 * mini_jump + 4 * big_jump; +enum LighthouseState LighthouseState_findByOffset(int offset) { + for (int i = 2; i < LS_END + 1; i++) { + if (LS_Params[i].offset > offset) + return i - 1; } + assert(false); return -1; } @@ -166,7 +134,7 @@ typedef struct { uint64_t last_sync_timestamp; uint64_t last_sync_length; int last_sync_count; - + int stabalize; bool lastWasSync; SensorHistory_t histories[]; @@ -186,8 +154,8 @@ static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { } static int find_acode(uint32_t pulseLen) { - const static int offset = 0; - if (pulseLen < 2200 + offset) + const static int offset = 50; + if (pulseLen < 2500 + offset) return -1; if (pulseLen < 3000 + offset) @@ -302,24 +270,46 @@ static enum LightcapClassification update_histories(Disambiguator_data_t *d, con return classification; } +#define ACODE_TIMING(acode) \ + ((3000 + ((acode)&1) * 500 + (((acode) >> 1) & 1) * 1000 + (((acode) >> 2) & 1) * 2000) - 250) #define ACODE(s, d, a) ((s << 2) | (d << 1) | a) #define SWEEP 0xFF +static uint32_t SolveForMod_Offset(Disambiguator_data_t *d, enum LighthouseState state, const LightcapElement *le) { + assert(LS_Params[state].acode >= 0); // Doesn't work for sweep data + SurviveContext *ctx = d->so->ctx; + DEBUG_TB("Solve for mod %d (%u - %u) = %u", state, le->timestamp, LS_Params[state].offset, + (le->timestamp - LS_Params[state].offset)); + + return (le->timestamp - LS_Params[state].offset); +} + +static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElement *le, + enum LighthouseState new_state); static enum LighthouseState CheckEncodedAcode(Disambiguator_data_t *d, uint8_t newByte) { SurviveContext *ctx = d->so->ctx; d->encoded_acodes &= 0xFF; d->encoded_acodes = (d->encoded_acodes << 8) | newByte; //(acode & (SKIP_BIT | AXIS_BIT)); - SV_INFO("0x%x", d->encoded_acodes); + DEBUG_TB("0x%x", d->encoded_acodes); + LightcapElement lastSync = get_last_sync(d); switch (d->encoded_acodes) { case (ACODE(0, 1, 0) << 8) | SWEEP: - return LS_SweepAX + 1; + d->mod_offset = SolveForMod_Offset(d, LS_SweepAX - 1, &lastSync); + + return (LS_SweepAX + 1); case (ACODE(0, 1, 1) << 8) | SWEEP: - return LS_SweepAY + 1; + d->mod_offset = SolveForMod_Offset(d, LS_SweepAY - 1, &lastSync); + + return (LS_SweepAY + 1); case (SWEEP << 8) | (ACODE(0, 1, 1)): - return LS_SweepBX + 1; + d->mod_offset = SolveForMod_Offset(d, LS_WaitLHB_ACode1, &lastSync); + + return (LS_WaitLHB_ACode1 + 1); case (SWEEP << 8) | (ACODE(1, 1, 0)): - return LS_SweepBY + 1; + d->mod_offset = SolveForMod_Offset(d, LS_WaitLHA_ACode4, &lastSync); + + return (LS_WaitLHA_ACode4 + 1); } return LS_UNKNOWN; @@ -331,10 +321,10 @@ static enum LighthouseState EndSync(Disambiguator_data_t *d, const LightcapEleme SurviveContext *ctx = d->so->ctx; LightcapElement lastSync = get_last_sync(d); int acode = find_acode(lastSync.length); - SV_INFO("!!%.03f(%d)\tacode: %d 0x%x a:%d d:%d s:%d (%d)", - timestamp_diff(le->timestamp, lastSync.timestamp) / 48000., - timestamp_diff(le->timestamp, lastSync.timestamp), lastSync.length, acode, acode & 1, (bool)(acode & 2), - (bool)(acode & 4), acode & (SKIP_BIT | AXIS_BIT)); + DEBUG_TB("!!%.03f(%d)\tacode: %d 0x%x a:%d d:%d s:%d (%d)", + timestamp_diff(le->timestamp, lastSync.timestamp) / 48000., + timestamp_diff(le->timestamp, lastSync.timestamp), lastSync.length, acode, acode & 1, (bool)(acode & 2), + (bool)(acode & 4), acode & (SKIP_BIT | AXIS_BIT)); if (acode > 0) { return CheckEncodedAcode(d, (acode | DATA_BIT)); @@ -347,21 +337,29 @@ static enum LighthouseState EndSync(Disambiguator_data_t *d, const LightcapEleme static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const LightcapElement *le) { enum LightcapClassification classification = update_histories(d, le); + static uint32_t start = 0; + if (start == 0) + start = le->timestamp; + SurviveContext *ctx = d->so->ctx; + DEBUG_TB("%d(%.03f) %d Incoming %u %u", (le->timestamp - start), (le->timestamp - start) / 48000., classification, + le->timestamp, le->length); + if (classification == LCC_SYNC) { LightcapElement lastSync = get_last_sync(d); if (d->lastWasSync == false || overlaps(&lastSync, le) == false) { + if (d->lastWasSync && timestamp_diff(lastSync.timestamp, le->timestamp) > 30000) { // Missed a sweep window; clear encoded values. + SurviveContext *ctx = d->so->ctx; + // DEBUG_TB("Missed sweep window."); d->encoded_acodes = 0; } enum LighthouseState new_state = d->lastWasSync ? EndSync(d, le) : EndSweep(d, le); - if (new_state != LS_UNKNOWN) { - fprintf(stderr, "new state: %d\n", new_state); - } - // return new_state; + if (new_state != LS_UNKNOWN) + return new_state; d->last_sync_timestamp = le->timestamp; d->last_sync_length = le->length; @@ -376,7 +374,8 @@ static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const Ligh } else { if (d->lastWasSync) { enum LighthouseState new_state = EndSync(d, le); - fprintf(stderr, "Sweep start\n\n"); + if (new_state != LS_UNKNOWN) + return new_state; } d->lastWasSync = false; } @@ -384,45 +383,84 @@ static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const Ligh return LS_UNKNOWN; } -static void SetState(Disambiguator_data_t *d, const LightcapElement *le, enum LighthouseState new_state) { +static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElement *le, + enum LighthouseState new_state) { SurviveContext *ctx = d->so->ctx; - SV_INFO("State transition %d -> %d at %u(%.03f)", d->state, new_state, le->timestamp, - timestamp_diff(d->last_state_transition_time, le->timestamp) / 480000.); + if (new_state >= LS_END) + new_state = 1; + + d->encoded_acodes = 0; + DEBUG_TB("State transition %d -> %d at %u(%.03f)", d->state, new_state, le->timestamp, + timestamp_diff(d->last_state_transition_time, le->timestamp) / 480000.); d->state = new_state; - if (d->state >= LS_END) - d->state = 1; d->last_state_transition_time = le->timestamp; + + d->last_sync_timestamp = d->last_sync_length = d->last_sync_count = 0; + + return new_state; } static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le); static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const LightcapElement *le) { + if (le->length < 100) + return; + int acode = find_acode(le->length); SurviveContext *ctx = d->so->ctx; - SV_INFO("acode %d %d 0x%x", target_acode, le->length, acode); + uint32_t time_error_d0 = abs(ACODE_TIMING(target_acode) - le->length); + uint32_t time_error_d1 = abs(ACODE_TIMING(target_acode | DATA_BIT) - le->length); + uint32_t error = time_error_d0 > time_error_d1 ? time_error_d1 : time_error_d0; - if (target_acode != (acode & (SKIP_BIT | AXIS_BIT))) - SetState(d, le, LS_UNKNOWN); + DEBUG_TB("acode %d %d 0x%x (%d)", target_acode, le->length, acode, error); + if (error > 1250) { + if (d->confidence-- == 0) { + SetState(d, le, LS_UNKNOWN); + assert(false); + } + return; + } + + if (d->confidence < 100) + d->confidence++; + d->last_sync_timestamp += le->timestamp; + d->last_sync_length += le->length; + d->last_sync_count++; } static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { - int acode, lh, axis, window; - LighthouseState_Parameterize(d->state, &acode, &lh, &axis, &window); + int le_offset = le->timestamp > d->mod_offset + ? (le->timestamp - d->mod_offset + 10000) % LS_Params[LS_END].offset + : (0xFFFFFFFF - d->mod_offset + le->timestamp + 10000) % LS_Params[LS_END].offset; + enum LighthouseState new_state = LighthouseState_findByOffset(le_offset); SurviveContext *ctx = d->so->ctx; - SV_INFO("param %u %d %d %d", le->timestamp, acode, le->length, window + d->last_state_transition_time); - - if (le->timestamp < d->last_state_transition_time + window) { - if (acode != -1) { - RunACodeCapture(acode, d, le); - } else { - // RunLightDataCapture(lh, axis, d, le); + DEBUG_TB("new %u %d %d %d %d", le->timestamp, le->length, le_offset, LS_Params[d->state].offset, + LS_Params[new_state].offset); + + if (d->state != new_state) { + if (d->last_sync_count > 0 && LS_Params[d->state].acode >= 0) { + LightcapElement lastSync = get_last_sync(d); + uint32_t mo = SolveForMod_Offset(d, d->state, &lastSync); + DEBUG_TB("New mod offset diff %d", (int)d->mod_offset - (int)mo); + d->mod_offset = mo; } + + SetState(d, le, new_state); + } + const LighthouseStateParameters *param = &LS_Params[d->state]; + + DEBUG_TB("param %u %d %d %d %d %d", le->timestamp, param->acode, le->length, le_offset, new_state, + LS_Params[d->state].offset); + + if (param->acode != -1) { + RunACodeCapture(param->acode, d, le); } else { - SetState(d, le, d->state + 1); - PropagateState(d, le); + DEBUG_TB("Logic for sweep %d", le->length); + // assert( le->length < 2200); + // RunLightDataCapture(lh, axis, d, le); } } @@ -435,21 +473,29 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { } if (so->disambiguator_data == NULL) { - SV_INFO("Initializing Disambiguator Data for TB %d", so->sensor_ct); + DEBUG_TB("Initializing Disambiguator Data for TB %d", so->sensor_ct); so->disambiguator_data = Disambiguator_data_t_ctor(so); } Disambiguator_data_t *d = so->disambiguator_data; // assert(d->last_seen_time < le->timestamp || d->last_seen_time - le->timestamp > 0x8FFFFFFF); + if (d->stabalize < 500) { + d->stabalize++; + return; + } + d->last_seen_time = le->timestamp; if (d->state == LS_UNKNOWN) { enum LighthouseState new_state = AttemptFindState(d, le); if (new_state != LS_UNKNOWN) { + LightcapElement lastSync = get_last_sync(d); d->confidence = 0; - d->mod_offset = (le->timestamp % LighthouseState_offset(LS_END)) - LighthouseState_offset(new_state); - // SetState(d, le, new_state); - SV_INFO("Locked onto state %d at %u", new_state, d->mod_offset); + + int le_offset = (le->timestamp - d->mod_offset) % LS_Params[LS_END].offset; + enum LighthouseState new_state1 = LighthouseState_findByOffset(le_offset); + SetState(d, le, new_state1); + DEBUG_TB("Locked onto state %d(%d, %d) at %u", new_state, new_state1, le_offset, d->mod_offset); } } else { PropagateState(d, le); -- cgit v1.2.3 From 2e4625f76a44359fcc77b9131b18919703bba1be Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Tue, 27 Mar 2018 17:17:45 -0600 Subject: Added hooks; seems like it works but is noiser than other disambiguators? --- src/survive_tb_disambiguator.c | 110 +++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c index 8bb4617..a807012 100644 --- a/src/survive_tb_disambiguator.c +++ b/src/survive_tb_disambiguator.c @@ -54,53 +54,34 @@ enum LighthouseState { LS_END }; -typedef struct { int acode, lh, axis, window, offset; } LighthouseStateParameters; +typedef struct { + int acode, lh, axis, window, offset; + bool is_sweep; +} LighthouseStateParameters; +// clang-format off const LighthouseStateParameters LS_Params[LS_END + 1] = { {.acode = -1, .lh = -1, .axis = -1, .window = -1}, - {.acode = 4, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 0 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 0 - {.acode = 0, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 1 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 20000 - {.acode = -1, - .lh = 0, - .axis = 0, - .window = CAPTURE_WINDOW, - .offset = 2 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 40000 - - {.acode = 5, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 2 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 400000 - {.acode = 1, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 3 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 420000 - {.acode = -1, - .lh = 0, - .axis = 1, - .window = CAPTURE_WINDOW, - .offset = 4 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 440000 - - {.acode = 0, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 4 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 800000 - {.acode = 4, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 5 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 820000 - {.acode = -1, - .lh = 1, - .axis = 0, - .window = CAPTURE_WINDOW, - .offset = 6 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 840000 - - {.acode = 1, - .lh = 1, - .axis = 1, - .window = PULSE_WINDOW, - .offset = 6 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1200000 - {.acode = 5, - .lh = 0, - .axis = 1, - .window = PULSE_WINDOW, - .offset = 7 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1220000 - {.acode = -1, - .lh = 1, - .axis = 1, - .window = CAPTURE_WINDOW, - .offset = 8 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1240000 + {.acode = 4, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 0 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 0 + {.acode = 0, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 1 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 20000 + {.acode = 0, .lh = 1, .axis = 0, .window = CAPTURE_WINDOW, .offset = 2 * PULSE_WINDOW + 0 * CAPTURE_WINDOW,.is_sweep = 1}, // 40000 + + {.acode = 5, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 2 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 400000 + {.acode = 1, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 3 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 420000 + {.acode = 1, .lh = 1, .axis = 1, .window = CAPTURE_WINDOW, .offset = 4 * PULSE_WINDOW + 1 * CAPTURE_WINDOW,.is_sweep = 1}, // 440000 + + {.acode = 0, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 4 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 800000 + {.acode = 4, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 5 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 820000 + {.acode = 0, .lh = 0, .axis = 0, .window = CAPTURE_WINDOW, .offset = 6 * PULSE_WINDOW + 2 * CAPTURE_WINDOW,.is_sweep = 1}, // 840000 + + {.acode = 1, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 6 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1200000 + {.acode = 5, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 7 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1220000 + {.acode = 1, .lh = 0, .axis = 1, .window = CAPTURE_WINDOW, .offset = 8 * PULSE_WINDOW + 3 * CAPTURE_WINDOW,.is_sweep = 1}, // 1240000 {.acode = -1, .lh = -1, .axis = -1, .window = -1, .offset = 8 * PULSE_WINDOW + 4 * CAPTURE_WINDOW} // 1600000 }; +// clang-format on enum LighthouseState LighthouseState_findByOffset(int offset) { for (int i = 2; i < LS_END + 1; i++) { @@ -121,14 +102,16 @@ typedef struct { typedef struct { SurviveObject *so; + /** This part of the structure is general use when we know our state */ uint32_t mod_offset; enum LighthouseState state; uint32_t last_state_transition_time; int confidence; uint32_t last_seen_time; - /** This rest of the structure is dedicated to finding a state when we are unknown */ + LightcapElement sweep_data[SENSORS_PER_OBJECT]; + /** This rest of the structure is dedicated to finding a state when we are unknown */ int encoded_acodes; /* Keep running average of sync signals as they come in */ uint64_t last_sync_timestamp; @@ -276,7 +259,7 @@ static enum LightcapClassification update_histories(Disambiguator_data_t *d, con #define SWEEP 0xFF static uint32_t SolveForMod_Offset(Disambiguator_data_t *d, enum LighthouseState state, const LightcapElement *le) { - assert(LS_Params[state].acode >= 0); // Doesn't work for sweep data + assert(LS_Params[state].is_sweep == 0); // Doesn't work for sweep data SurviveContext *ctx = d->so->ctx; DEBUG_TB("Solve for mod %d (%u - %u) = %u", state, le->timestamp, LS_Params[state].offset, (le->timestamp - LS_Params[state].offset)); @@ -398,10 +381,16 @@ static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElem d->last_state_transition_time = le->timestamp; d->last_sync_timestamp = d->last_sync_length = d->last_sync_count = 0; + memset(d->sweep_data, 0, sizeof(LightcapElement) * SENSORS_PER_OBJECT); return new_state; } +static void RunLightDataCapture(Disambiguator_data_t *d, const LightcapElement *le) { + if (le->length > d->sweep_data[le->sensor_id].length) + d->sweep_data[le->sensor_id] = *le; +} + static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le); static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const LightcapElement *le) { if (le->length < 100) @@ -416,10 +405,11 @@ static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const Lig DEBUG_TB("acode %d %d 0x%x (%d)", target_acode, le->length, acode, error); if (error > 1250) { - if (d->confidence-- == 0) { + if (d->confidence < 3) { SetState(d, le, LS_UNKNOWN); assert(false); } + d->confidence -= 3; return; } @@ -441,26 +431,41 @@ static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { LS_Params[new_state].offset); if (d->state != new_state) { - if (d->last_sync_count > 0 && LS_Params[d->state].acode >= 0) { - LightcapElement lastSync = get_last_sync(d); - uint32_t mo = SolveForMod_Offset(d, d->state, &lastSync); - DEBUG_TB("New mod offset diff %d", (int)d->mod_offset - (int)mo); - d->mod_offset = mo; + if (LS_Params[d->state].is_sweep == 0) { + if (d->last_sync_count > 0) { + LightcapElement lastSync = get_last_sync(d); + uint32_t mo = SolveForMod_Offset(d, d->state, &lastSync); + DEBUG_TB("New mod offset diff %d", (int)d->mod_offset - (int)mo); + d->mod_offset = mo; + int acode = find_acode(lastSync.length); + assert((acode | DATA_BIT) == (LS_Params[d->state].acode | DATA_BIT)); + ctx->lightproc(d->so, -LS_Params[d->state].lh - 1, acode, 0, lastSync.timestamp, lastSync.length, + LS_Params[d->state].lh); + } + } else { + for (int i = 0; i < SENSORS_PER_OBJECT; i++) { + if (d->sweep_data[i].length > 0) { + d->so->ctx->lightproc( + d->so, i, LS_Params[d->state].acode, + timestamp_diff(d->sweep_data[i].timestamp, d->mod_offset + LS_Params[d->state].offset), + d->sweep_data[i].timestamp, d->sweep_data[i].length, LS_Params[d->state].lh); + } + } } SetState(d, le, new_state); } - const LighthouseStateParameters *param = &LS_Params[d->state]; + const LighthouseStateParameters *param = &LS_Params[d->state]; DEBUG_TB("param %u %d %d %d %d %d", le->timestamp, param->acode, le->length, le_offset, new_state, LS_Params[d->state].offset); - if (param->acode != -1) { + if (param->is_sweep == 0) { RunACodeCapture(param->acode, d, le); } else { DEBUG_TB("Logic for sweep %d", le->length); // assert( le->length < 2200); - // RunLightDataCapture(lh, axis, d, le); + RunLightDataCapture(d, le); } } @@ -478,14 +483,11 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { } Disambiguator_data_t *d = so->disambiguator_data; - // assert(d->last_seen_time < le->timestamp || d->last_seen_time - le->timestamp > 0x8FFFFFFF); - if (d->stabalize < 500) { d->stabalize++; return; } - d->last_seen_time = le->timestamp; if (d->state == LS_UNKNOWN) { enum LighthouseState new_state = AttemptFindState(d, le); if (new_state != LS_UNKNOWN) { -- cgit v1.2.3 From c6e57ed971214377f4340b3b4343495d5b24cd88 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 00:10:23 -0600 Subject: Compiler warns unused on non inlined statics --- redist/os_generic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redist/os_generic.h b/redist/os_generic.h index 853440a..0d1c7e7 100644 --- a/redist/os_generic.h +++ b/redist/os_generic.h @@ -214,7 +214,7 @@ OSG_INLINE og_thread_t OGCreateThread(void *(routine)(void *), void *parameter) return (og_thread_t)ret; } -static void *OGJoinThread(og_thread_t ot) { +OSG_INLINE void *OGJoinThread(og_thread_t ot) { void *retval; if (!ot) { return 0; -- cgit v1.2.3 From 1ca9196f93a4d9fa09736112c880634392536d8e Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 00:11:04 -0600 Subject: Bigger chemtrails; colors on HMD trackers --- tools/viz/survive_viewer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/viz/survive_viewer.js b/tools/viz/survive_viewer.js index 67e65f0..d7f80ad 100644 --- a/tools/viz/survive_viewer.js +++ b/tools/viz/survive_viewer.js @@ -130,7 +130,7 @@ function redrawCanvas(when) { for (var key in angles) { for (var lh = 0; lh < 2; lh++) { - var bvalue = {"WW0" : "FF", "TR0" : "00"}; + var bvalue = {"WW0" : "FF", "TR0" : "00", "HMD" : "88"}; ctx.strokeStyle = (lh === 0 ? "#FF00" : "#00FF") + bvalue[key]; if (angles[key][lh]) @@ -190,7 +190,7 @@ function create_tracked_object(info) { } var trails; -var MAX_LINE_POINTS = 1000; +var MAX_LINE_POINTS = 100000; $(function() { $("#trails").change(function() { if (this.checked) { -- cgit v1.2.3 From ad76877aa0f75c30c35d4d6e0f5434828e36cba7 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 00:11:10 -0600 Subject: Finished! --- Makefile | 2 +- src/survive_tb_disambiguator.c | 72 ++++++++++++++++++++++-------------------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/Makefile b/Makefile index e0c5306..878d9c1 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all : lib data_recorder test calibrate calibrate_client simple_pose_test CC?=gcc -CFLAGS:=-Iinclude/libsurvive -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable +CFLAGS:=-Iinclude/libsurvive -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable -Wno-pointer-sign -Wno-parentheses CFLAGS_RELEASE:=-Iinclude/libsurvive -fPIC -msse2 -ftree-vectorize -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c index a807012..078743a 100644 --- a/src/survive_tb_disambiguator.c +++ b/src/survive_tb_disambiguator.c @@ -65,11 +65,11 @@ const LighthouseStateParameters LS_Params[LS_END + 1] = { {.acode = 4, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 0 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 0 {.acode = 0, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 1 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 20000 - {.acode = 0, .lh = 1, .axis = 0, .window = CAPTURE_WINDOW, .offset = 2 * PULSE_WINDOW + 0 * CAPTURE_WINDOW,.is_sweep = 1}, // 40000 + {.acode = 4, .lh = 1, .axis = 0, .window = CAPTURE_WINDOW, .offset = 2 * PULSE_WINDOW + 0 * CAPTURE_WINDOW,.is_sweep = 1}, // 40000 {.acode = 5, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 2 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 400000 {.acode = 1, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 3 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 420000 - {.acode = 1, .lh = 1, .axis = 1, .window = CAPTURE_WINDOW, .offset = 4 * PULSE_WINDOW + 1 * CAPTURE_WINDOW,.is_sweep = 1}, // 440000 + {.acode = 5, .lh = 1, .axis = 1, .window = CAPTURE_WINDOW, .offset = 4 * PULSE_WINDOW + 1 * CAPTURE_WINDOW,.is_sweep = 1}, // 440000 {.acode = 0, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 4 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 800000 {.acode = 4, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 5 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 820000 @@ -102,6 +102,7 @@ typedef struct { typedef struct { SurviveObject *so; + uint32_t time_of_last_sync[NUM_LIGHTHOUSES]; /** This part of the structure is general use when we know our state */ uint32_t mod_offset; @@ -113,6 +114,7 @@ typedef struct { /** This rest of the structure is dedicated to finding a state when we are unknown */ int encoded_acodes; + /* Keep running average of sync signals as they come in */ uint64_t last_sync_timestamp; uint64_t last_sync_length; @@ -123,13 +125,6 @@ typedef struct { } Disambiguator_data_t; -Disambiguator_data_t *Disambiguator_data_t_ctor(SurviveObject *so) { - Disambiguator_data_t *rtn = calloc(1, sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct); - rtn->so = so; - - return rtn; -} - static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { if (recent > prior) return recent - prior; @@ -161,9 +156,6 @@ static int find_acode(uint32_t pulseLen) { return -1; } -#define LOWER_SYNC_TIME 2250 -#define UPPER_SYNC_TIME 6750 - static int circle_buffer_get(int idx, int offset) { return ((idx + offset) + NUM_HISTORY) % NUM_HISTORY; } static bool overlaps(const LightcapElement *a, const LightcapElement *b) { @@ -180,6 +172,9 @@ const int SKIP_BIT = 4; const int DATA_BIT = 2; const int AXIS_BIT = 1; +#define LOWER_SYNC_TIME 2250 +#define UPPER_SYNC_TIME 6750 + LightcapElement get_last_sync(Disambiguator_data_t *d) { if (d->last_sync_count == 0) { return (LightcapElement){0}; @@ -386,11 +381,6 @@ static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElem return new_state; } -static void RunLightDataCapture(Disambiguator_data_t *d, const LightcapElement *le) { - if (le->length > d->sweep_data[le->sensor_id].length) - d->sweep_data[le->sensor_id] = *le; -} - static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le); static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const LightcapElement *le) { if (le->length < 100) @@ -407,7 +397,8 @@ static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const Lig if (error > 1250) { if (d->confidence < 3) { SetState(d, le, LS_UNKNOWN); - assert(false); + // assert(false); + SV_INFO("WARNING: Disambiguator got lost; refinding state."); } d->confidence -= 3; return; @@ -431,24 +422,37 @@ static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { LS_Params[new_state].offset); if (d->state != new_state) { + static uint64_t sync2syncs[LS_END] = {0}; + static uint64_t sync2syncsCnt[LS_END] = {0}; + if (LS_Params[d->state].is_sweep == 0) { if (d->last_sync_count > 0) { LightcapElement lastSync = get_last_sync(d); uint32_t mo = SolveForMod_Offset(d, d->state, &lastSync); - DEBUG_TB("New mod offset diff %d", (int)d->mod_offset - (int)mo); + DEBUG_TB("New mod offset diff %d %u", (int)d->mod_offset - (int)mo, mo); d->mod_offset = mo; - int acode = find_acode(lastSync.length); - assert((acode | DATA_BIT) == (LS_Params[d->state].acode | DATA_BIT)); + + int lengthData = ACODE_TIMING(LS_Params[d->state].acode | DATA_BIT); + int lengthNoData = ACODE_TIMING(LS_Params[d->state].acode); + + bool hasData = abs(lengthData - lastSync.length) < abs(lengthNoData - lastSync.length); + int acode = LS_Params[d->state].acode; + if (hasData) + acode |= DATA_BIT; + ctx->lightproc(d->so, -LS_Params[d->state].lh - 1, acode, 0, lastSync.timestamp, lastSync.length, LS_Params[d->state].lh); + d->time_of_last_sync[LS_Params[d->state].lh] = lastSync.timestamp; } } else { for (int i = 0; i < SENSORS_PER_OBJECT; i++) { - if (d->sweep_data[i].length > 0) { - d->so->ctx->lightproc( - d->so, i, LS_Params[d->state].acode, - timestamp_diff(d->sweep_data[i].timestamp, d->mod_offset + LS_Params[d->state].offset), - d->sweep_data[i].timestamp, d->sweep_data[i].length, LS_Params[d->state].lh); + LightcapElement le = d->sweep_data[i]; + if (le.length > 0 && d->time_of_last_sync[LS_Params[d->state].lh] > 0) { + int32_t offset_from = + timestamp_diff(le.timestamp + le.length / 2, d->time_of_last_sync[LS_Params[d->state].lh]); + assert(offset_from > 0); + d->so->ctx->lightproc(d->so, i, LS_Params[d->state].acode, offset_from, le.timestamp, le.length, + LS_Params[d->state].lh); } } } @@ -457,15 +461,12 @@ static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { } const LighthouseStateParameters *param = &LS_Params[d->state]; - DEBUG_TB("param %u %d %d %d %d %d", le->timestamp, param->acode, le->length, le_offset, new_state, - LS_Params[d->state].offset); - if (param->is_sweep == 0) { RunACodeCapture(param->acode, d, le); } else { - DEBUG_TB("Logic for sweep %d", le->length); - // assert( le->length < 2200); - RunLightDataCapture(d, le); + if (le->length > d->sweep_data[le->sensor_id].length) { + d->sweep_data[le->sensor_id] = *le; + } } } @@ -479,11 +480,14 @@ void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { if (so->disambiguator_data == NULL) { DEBUG_TB("Initializing Disambiguator Data for TB %d", so->sensor_ct); - so->disambiguator_data = Disambiguator_data_t_ctor(so); + Disambiguator_data_t *d = calloc(1, sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct); + d->so = so; + so->disambiguator_data = d; } Disambiguator_data_t *d = so->disambiguator_data; - if (d->stabalize < 500) { + // It seems like the first few hundred lightcapelements are missing a ton of data; let it stabilize. + if (d->stabalize < 200) { d->stabalize++; return; } -- cgit v1.2.3 From bf92b059271e7be0db6f91660ad8abd1c71e8e73 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 00:59:14 -0600 Subject: Cleanup + Comments --- Makefile | 4 +- src/survive_statebased_disambiguator.c | 469 ++++++++++++++++++++++++++++++ src/survive_tb_disambiguator.c | 511 --------------------------------- 3 files changed, 471 insertions(+), 513 deletions(-) create mode 100644 src/survive_statebased_disambiguator.c delete mode 100644 src/survive_tb_disambiguator.c diff --git a/Makefile b/Makefile index 878d9c1..ee55a2d 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all : lib data_recorder test calibrate calibrate_client simple_pose_test CC?=gcc -CFLAGS:=-Iinclude/libsurvive -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable -Wno-pointer-sign -Wno-parentheses +CFLAGS:=-Iinclude/libsurvive -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm -fsanitize=address -fsanitize=undefined -Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable -Wno-pointer-sign -Wno-parentheses CFLAGS_RELEASE:=-Iinclude/libsurvive -fPIC -msse2 -ftree-vectorize -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm @@ -39,7 +39,7 @@ REDISTS:=redist/json_helpers.o redist/linmath.o redist/jsmn.o redist/minimal_ope ifeq ($(UNAME), Darwin) REDISTS:=$(REDISTS) redist/hid-osx.c endif -LIBSURVIVE_CORE:=src/survive.o src/survive_usb.o src/survive_charlesbiguator.o src/survive_process.o src/ootx_decoder.o src/survive_driverman.o src/survive_default_devices.o src/survive_vive.o src/survive_playback.o src/survive_config.o src/survive_cal.o src/survive_reproject.o src/poser.o src/epnp/epnp.c src/survive_sensor_activations.o src/survive_turveybiguator.o src/survive_disambiguator.o src/survive_tb_disambiguator.o +LIBSURVIVE_CORE:=src/survive.o src/survive_usb.o src/survive_charlesbiguator.o src/survive_process.o src/ootx_decoder.o src/survive_driverman.o src/survive_default_devices.o src/survive_vive.o src/survive_playback.o src/survive_config.o src/survive_cal.o src/survive_reproject.o src/poser.o src/epnp/epnp.c src/survive_sensor_activations.o src/survive_turveybiguator.o src/survive_disambiguator.o src/survive_statebased_disambiguator.o #If you want to use HIDAPI on Linux. #CFLAGS:=$(CFLAGS) -DHIDAPI diff --git a/src/survive_statebased_disambiguator.c b/src/survive_statebased_disambiguator.c new file mode 100644 index 0000000..4aa47ba --- /dev/null +++ b/src/survive_statebased_disambiguator.c @@ -0,0 +1,469 @@ +// +#include "survive_internal.h" +#include +#include /* for sqrt */ +#include +#include +#include + +//#define DEBUG_TB(...) SV_INFO(__VA_ARGS__) +#define DEBUG_TB(...) +/** + * The lighthouses go in the following order: + * + * Ticks State + * 0 ACode 0b1x0 (4) <--- B + * 20 000 ACode 0b0x0 (0) <--- A/c + * LH A X Sweep + * 400 000 ACode 0b1x1 (5) <--- B + * 420 000 ACode 0b0x1 (1) <--- A/c + * LH A Y SWEEP + * 800 000 ACode 0b0x0 (0) <--- B + * 820 000 ACode 0b1x0 (4) <--- A/c + * LH B X Sweep + * 1 200 000 ACode 0b0x1 (1) <--- B + * 1 220 000 ACode 0b1x1 (5) <--- A/c + * LH B Y SWEEP + * 1 600 000 < REPEAT > + * + * NOTE: Obviously you cut the data bit out for this + * + * This disambiguator works by finding where in that order it is, and tracking along with it. + * It is able to maintain this tracking for extended periods of time without further data + * by knowing the modulo of the start of the cycle and calculating appropriatly although this + * will run into issues when the timestamp rolls over or we simply drift off in accuracy. + * + * Neither case is terminal though; it will just have to find the modulo again which only takes + * a handful of pulses. + * + * The main advantage to this scheme is that its reasonably fast and is able to deal with being + * close enough to the lighthouse that the lengths are in a valid sync pulse range. + */ + +// Every pulse_window seems roughly 20k ticks long. That leaves ~360 to the capture window +#define PULSE_WINDOW 20000 +#define CAPTURE_WINDOW 360000 + +enum LighthouseState { + LS_UNKNOWN = 0, + + LS_WaitLHA_ACode4 = 1, + LS_WaitLHA_ACode0, + LS_SweepAX, + LS_WaitLHA_ACode5, + LS_WaitLHA_ACode1, + LS_SweepAY, + LS_WaitLHB_ACode0, + LS_WaitLHB_ACode4, + LS_SweepBX, + LS_WaitLHB_ACode1, + LS_WaitLHB_ACode5, + LS_SweepBY, + + LS_END +}; + +typedef struct { + int acode, lh, axis, window, offset; + bool is_sweep; +} LighthouseStateParameters; + +// clang-format off +const LighthouseStateParameters LS_Params[LS_END + 1] = { + {.acode = -1, .lh = -1, .axis = -1, .window = -1}, + + {.acode = 4, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 0 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 0 + {.acode = 0, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 1 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 20000 + {.acode = 4, .lh = 1, .axis = 0, .window = CAPTURE_WINDOW, .offset = 2 * PULSE_WINDOW + 0 * CAPTURE_WINDOW, .is_sweep = 1}, // 40000 + + {.acode = 5, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 2 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 400000 + {.acode = 1, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 3 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 420000 + {.acode = 5, .lh = 1, .axis = 1, .window = CAPTURE_WINDOW, .offset = 4 * PULSE_WINDOW + 1 * CAPTURE_WINDOW, .is_sweep = 1}, // 440000 + + {.acode = 0, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 4 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 800000 + {.acode = 4, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 5 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 820000 + {.acode = 0, .lh = 0, .axis = 0, .window = CAPTURE_WINDOW, .offset = 6 * PULSE_WINDOW + 2 * CAPTURE_WINDOW, .is_sweep = 1}, // 840000 + + {.acode = 1, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 6 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1200000 + {.acode = 5, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 7 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1220000 + {.acode = 1, .lh = 0, .axis = 1, .window = CAPTURE_WINDOW, .offset = 8 * PULSE_WINDOW + 3 * CAPTURE_WINDOW, .is_sweep = 1}, // 1240000 + + {.acode = -1, .lh = -1, .axis = -1, .window = -1, .offset = 8 * PULSE_WINDOW + 4 * CAPTURE_WINDOW} // 1600000 +}; +// clang-format on + +enum LighthouseState LighthouseState_findByOffset(int offset) { + for (int i = 2; i < LS_END + 1; i++) { + if (LS_Params[i].offset > offset) + return i - 1; + } + assert(false); + return -1; +} + +typedef struct { + SurviveObject *so; + /* We keep the last sync time per LH because lightproc expects numbers relative to it */ + uint32_t time_of_last_sync[NUM_LIGHTHOUSES]; + + /* Keep running average of sync signals as they come in */ + uint64_t last_sync_timestamp; + uint64_t last_sync_length; + int last_sync_count; + + /** This part of the structure is general use when we know our state */ + enum LighthouseState state; + uint32_t mod_offset; + int confidence; + + /** This rest of the structure is dedicated to finding a state when we are unknown */ + int encoded_acodes; + + int stabalize; + bool lastWasSync; + + LightcapElement sweep_data[]; +} Disambiguator_data_t; + +static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { + if (recent > prior) + return recent - prior; + return (0xFFFFFFFF - prior) + recent; +} + +static int find_acode(uint32_t pulseLen) { + const static int offset = 50; + if (pulseLen < 2500 + offset) + return -1; + + if (pulseLen < 3000 + offset) + return 0; + if (pulseLen < 3500 + offset) + return 1; + if (pulseLen < 4000 + offset) + return 2; + if (pulseLen < 4500 + offset) + return 3; + if (pulseLen < 5000 + offset) + return 4; + if (pulseLen < 5500 + offset) + return 5; + if (pulseLen < 6000 + offset) + return 6; + if (pulseLen < 6500 + offset) + return 7; + + return -1; +} + +static bool overlaps(const LightcapElement *a, const LightcapElement *b) { + int overlap = 0; + if (a->timestamp < b->timestamp && a->length + a->timestamp > b->timestamp) + overlap = a->length + a->timestamp - b->timestamp; + else if (b->timestamp < a->timestamp && b->length + b->timestamp > a->timestamp) + overlap = b->length + b->timestamp - a->timestamp; + + return overlap > a->length / 2; +} + +const int SKIP_BIT = 4; +const int DATA_BIT = 2; +const int AXIS_BIT = 1; + +#define LOWER_SYNC_TIME 2250 +#define UPPER_SYNC_TIME 6750 + +LightcapElement get_last_sync(Disambiguator_data_t *d) { + if (d->last_sync_count == 0) { + return (LightcapElement){0}; + } + + return (LightcapElement){.timestamp = (d->last_sync_timestamp + d->last_sync_count / 2) / d->last_sync_count, + .length = (d->last_sync_length + d->last_sync_count / 2) / d->last_sync_count, + .sensor_id = -d->last_sync_count}; +} + +enum LightcapClassification { LCC_SWEEP, LCC_SYNC }; +static enum LightcapClassification naive_classify(Disambiguator_data_t *d, const LightcapElement *le) { + bool clearlyNotSync = le->length < LOWER_SYNC_TIME || le->length > UPPER_SYNC_TIME; + + if (clearlyNotSync) { + return LCC_SWEEP; + } else { + return LCC_SYNC; + } +} + +#define ACODE_TIMING(acode) \ + ((3000 + ((acode)&1) * 500 + (((acode) >> 1) & 1) * 1000 + (((acode) >> 2) & 1) * 2000) - 250) +#define ACODE(s, d, a) ((s << 2) | (d << 1) | a) +#define SWEEP 0xFF + +static uint32_t SolveForMod_Offset(Disambiguator_data_t *d, enum LighthouseState state, const LightcapElement *le) { + assert(LS_Params[state].is_sweep == 0); // Doesn't work for sweep data + SurviveContext *ctx = d->so->ctx; + DEBUG_TB("Solve for mod %d (%u - %u) = %u", state, le->timestamp, LS_Params[state].offset, + (le->timestamp - LS_Params[state].offset)); + + return (le->timestamp - LS_Params[state].offset); +} + +static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElement *le, + enum LighthouseState new_state); +static enum LighthouseState CheckEncodedAcode(Disambiguator_data_t *d, uint8_t newByte) { + + // We chain together acodes / sweep indicators to form an int we can just switch on. + SurviveContext *ctx = d->so->ctx; + d->encoded_acodes &= 0xFF; + d->encoded_acodes = (d->encoded_acodes << 8) | newByte; + + LightcapElement lastSync = get_last_sync(d); + + // These combinations are checked for specificaly to allow for the case one lighthouse is either + // missing or completely occluded. + switch (d->encoded_acodes) { + case (ACODE(0, 1, 0) << 8) | SWEEP: + d->mod_offset = SolveForMod_Offset(d, LS_SweepAX - 1, &lastSync); + + return (LS_SweepAX + 1); + case (ACODE(0, 1, 1) << 8) | SWEEP: + d->mod_offset = SolveForMod_Offset(d, LS_SweepAY - 1, &lastSync); + + return (LS_SweepAY + 1); + case (SWEEP << 8) | (ACODE(0, 1, 1)): + d->mod_offset = SolveForMod_Offset(d, LS_WaitLHB_ACode1, &lastSync); + + return (LS_WaitLHB_ACode1 + 1); + case (SWEEP << 8) | (ACODE(1, 1, 0)): + d->mod_offset = SolveForMod_Offset(d, LS_WaitLHA_ACode4, &lastSync); + + return (LS_WaitLHA_ACode4 + 1); + } + + return LS_UNKNOWN; +} +static enum LighthouseState EndSweep(Disambiguator_data_t *d, const LightcapElement *le) { + return CheckEncodedAcode(d, SWEEP); +} +static enum LighthouseState EndSync(Disambiguator_data_t *d, const LightcapElement *le) { + LightcapElement lastSync = get_last_sync(d); + int acode = find_acode(lastSync.length) > 0; + if (acode > 0) { + return CheckEncodedAcode(d, (acode | DATA_BIT)); + } else { + // If we can't resolve an acode, just reset + d->encoded_acodes = 0; + } + return LS_UNKNOWN; +} + +static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const LightcapElement *le) { + enum LightcapClassification classification = naive_classify(d, le); + + if (classification == LCC_SYNC) { + LightcapElement lastSync = get_last_sync(d); + + // Handle the case that this is a new SYNC coming in + if (d->lastWasSync == false || overlaps(&lastSync, le) == false) { + + if (d->lastWasSync && timestamp_diff(lastSync.timestamp, le->timestamp) > 30000) { + // Missed a sweep window; clear encoded values. + d->encoded_acodes = 0; + } + + // Now that the previous two states are in, check to see if they tell us where we are + enum LighthouseState new_state = d->lastWasSync ? EndSync(d, le) : EndSweep(d, le); + if (new_state != LS_UNKNOWN) + return new_state; + + // Otherwise, just reset the sync registers and do another + d->last_sync_timestamp = le->timestamp; + d->last_sync_length = le->length; + d->last_sync_count = 1; + } else { + d->last_sync_timestamp += le->timestamp; + d->last_sync_length += le->length; + d->last_sync_count++; + } + + d->lastWasSync = true; + } else { + // If this is the start of a new sweep, check to see if the end of the sync solves + // the state + if (d->lastWasSync) { + enum LighthouseState new_state = EndSync(d, le); + if (new_state != LS_UNKNOWN) + return new_state; + } + d->lastWasSync = false; + } + + return LS_UNKNOWN; +} + +static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElement *le, + enum LighthouseState new_state) { + + SurviveContext *ctx = d->so->ctx; + if (new_state >= LS_END) + new_state = 1; + + d->encoded_acodes = 0; + d->state = new_state; + + d->last_sync_timestamp = d->last_sync_length = d->last_sync_count = 0; + memset(d->sweep_data, 0, sizeof(LightcapElement) * d->so->sensor_ct); + + return new_state; +} + +static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le); +static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const LightcapElement *le) { + // Just ignore small signals; this has a measurable impact on signal quality + if (le->length < 100) + return; + + // We know what state we are in, so we verify that state as opposed to + // trying to suss out the acode. + + // Calculate what it would be with and without data + uint32_t time_error_d0 = abs(ACODE_TIMING(target_acode) - le->length); + uint32_t time_error_d1 = abs(ACODE_TIMING(target_acode | DATA_BIT) - le->length); + + // Take the least of the two erors + uint32_t error = time_error_d0 > time_error_d1 ? time_error_d1 : time_error_d0; + + // Errors do happen; either reflections or some other noise. Our scheme here is to + // keep a tally of hits and misses, and if we ever go into the negatives reset + // the state machine to find the state again. + if (error > 1250) { + // Penalize semi-harshly -- if it's ever off track it will take this many syncs + // to reset + const int penalty = 3; + if (d->confidence < penalty) { + SurviveContext *ctx = d->so->ctx; + SetState(d, le, LS_UNKNOWN); + SV_INFO("WARNING: Disambiguator got lost; refinding state."); + } + d->confidence -= penalty; + return; + } + + if (d->confidence < 100) + d->confidence++; + + // If its a real timestep, integrate it here and we can take the average later + d->last_sync_timestamp += le->timestamp; + d->last_sync_length += le->length; + d->last_sync_count++; +} + +static void ProcessStateChange(Disambiguator_data_t *d, const LightcapElement *le, enum LighthouseState new_state) { + SurviveContext *ctx = d->so->ctx; + + // Leaving a sync ... + if (LS_Params[d->state].is_sweep == 0) { + if (d->last_sync_count > 0) { + // Use the average of the captured pulse to adjust where we are modulo against. + // This lets us handle drift in any of the timing chararacteristics + LightcapElement lastSync = get_last_sync(d); + d->mod_offset = SolveForMod_Offset(d, d->state, &lastSync); + + // Figure out if it looks more like it has data or doesn't. We need this for OOX + int lengthData = ACODE_TIMING(LS_Params[d->state].acode | DATA_BIT); + int lengthNoData = ACODE_TIMING(LS_Params[d->state].acode); + bool hasData = abs(lengthData - lastSync.length) < abs(lengthNoData - lastSync.length); + int acode = LS_Params[d->state].acode; + if (hasData) { + acode |= DATA_BIT; + } + ctx->lightproc(d->so, -LS_Params[d->state].lh - 1, acode, 0, lastSync.timestamp, lastSync.length, + LS_Params[d->state].lh); + + // Store last sync time for sweep calculations + d->time_of_last_sync[LS_Params[d->state].lh] = lastSync.timestamp; + } + } else { + // Leaving a sweep ... + for (int i = 0; i < d->so->sensor_ct; i++) { + LightcapElement le = d->sweep_data[i]; + // Only care if we actually have data AND we have a time of last sync. We won't have the latter + // if we synced with the LH at cetain times. + if (le.length > 0 && d->time_of_last_sync[LS_Params[d->state].lh] > 0) { + int32_t offset_from = + timestamp_diff(le.timestamp + le.length / 2, d->time_of_last_sync[LS_Params[d->state].lh]); + + // Send the lightburst out. + assert(offset_from > 0); + d->so->ctx->lightproc(d->so, i, LS_Params[d->state].acode, offset_from, le.timestamp, le.length, + LS_Params[d->state].lh); + } + } + } + + SetState(d, le, new_state); +} + +static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { + int le_offset = le->timestamp > d->mod_offset + ? (le->timestamp - d->mod_offset + 10000) % LS_Params[LS_END].offset + : (0xFFFFFFFF - d->mod_offset + le->timestamp + 10000) % LS_Params[LS_END].offset; + + /** Find where this new element fits into our state machine. This can skip states if its been a while since + * its been able to process, or if a LH is missing. */ + enum LighthouseState new_state = LighthouseState_findByOffset(le_offset); + + if (d->state != new_state) { + // This processes the change -- think setting buffers, and sending OOTX / lightproc calls + ProcessStateChange(d, le, new_state); + } + + const LighthouseStateParameters *param = &LS_Params[d->state]; + if (param->is_sweep == 0) { + RunACodeCapture(param->acode, d, le); + } else if (le->length > d->sweep_data[le->sensor_id].length) { + // Note we only select the highest length one per sweep. Also, we bundle everything up and send it later all at + // once. + // so that we can do this filtering. Might not be necessary? + d->sweep_data[le->sensor_id] = *le; + } +} + +void DisambiguatorStateBased(SurviveObject *so, const LightcapElement *le) { + SurviveContext *ctx = so->ctx; + + // Note, this happens if we don't have config yet -- just bail + if (so->sensor_ct == 0) { + return; + } + + if (so->disambiguator_data == NULL) { + DEBUG_TB("Initializing Disambiguator Data for TB %d", so->sensor_ct); + Disambiguator_data_t *d = calloc(1, sizeof(Disambiguator_data_t) + sizeof(LightcapElement) * so->sensor_ct); + d->so = so; + so->disambiguator_data = d; + } + + Disambiguator_data_t *d = so->disambiguator_data; + // It seems like the first few hundred lightcapelements are missing a ton of data; let it stabilize. + if (d->stabalize < 200) { + d->stabalize++; + return; + } + + if (d->state == LS_UNKNOWN) { + enum LighthouseState new_state = AttemptFindState(d, le); + if (new_state != LS_UNKNOWN) { + d->confidence = 0; + + int le_offset = (le->timestamp - d->mod_offset) % LS_Params[LS_END].offset; + enum LighthouseState new_state1 = LighthouseState_findByOffset(le_offset); + SetState(d, le, new_state1); + DEBUG_TB("Locked onto state %d(%d, %d) at %u", new_state, new_state1, le_offset, d->mod_offset); + } + } else { + PropagateState(d, le); + } +} + +REGISTER_LINKTIME(DisambiguatorStateBased); diff --git a/src/survive_tb_disambiguator.c b/src/survive_tb_disambiguator.c deleted file mode 100644 index 078743a..0000000 --- a/src/survive_tb_disambiguator.c +++ /dev/null @@ -1,511 +0,0 @@ -// -#include "survive_internal.h" -#include -#include /* for sqrt */ -#include -#include -#include - -#define NUM_HISTORY 3 - -//#define DEBUG_TB(...) SV_INFO(__VA_ARGS__) -#define DEBUG_TB(...) -/** - * The lighthouses go in the following order: - * - * Ticks State - * 0 ACode 0b1x0 (4) <--- B - * 20 000 ACode 0b0x0 (0) <--- A/c - * LH A X Sweep - * 400 000 ACode 0b1x1 (5) <--- B - * 420 000 ACode 0b0x1 (1) <--- A/c - * LH A Y SWEEP - * 800 000 ACode 0b0x0 (0) <--- B - * 820 000 ACode 0b1x0 (4) <--- A/c - * LH B X Sweep - * 1 200 000 ACode 0b0x1 (1) <--- B - * 1 220 000 ACode 0b1x1 (5) <--- A/c - * LH B Y SWEEP - * 1 600 000 < REPEAT > - * - * NOTE: Obviously you cut the data bit out for this - */ - -// Every pulse_window seems roughly 20k ticks long. That leaves ~360 to the capture window -#define PULSE_WINDOW 20000 -#define CAPTURE_WINDOW 360000 - -enum LighthouseState { - LS_UNKNOWN = 0, - - LS_WaitLHA_ACode4 = 1, - LS_WaitLHA_ACode0, - LS_SweepAX, - LS_WaitLHA_ACode5, - LS_WaitLHA_ACode1, - LS_SweepAY, - LS_WaitLHB_ACode0, - LS_WaitLHB_ACode4, - LS_SweepBX, - LS_WaitLHB_ACode1, - LS_WaitLHB_ACode5, - LS_SweepBY, - - LS_END -}; - -typedef struct { - int acode, lh, axis, window, offset; - bool is_sweep; -} LighthouseStateParameters; - -// clang-format off -const LighthouseStateParameters LS_Params[LS_END + 1] = { - {.acode = -1, .lh = -1, .axis = -1, .window = -1}, - - {.acode = 4, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 0 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 0 - {.acode = 0, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 1 * PULSE_WINDOW + 0 * CAPTURE_WINDOW}, // 20000 - {.acode = 4, .lh = 1, .axis = 0, .window = CAPTURE_WINDOW, .offset = 2 * PULSE_WINDOW + 0 * CAPTURE_WINDOW,.is_sweep = 1}, // 40000 - - {.acode = 5, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 2 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 400000 - {.acode = 1, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 3 * PULSE_WINDOW + 1 * CAPTURE_WINDOW}, // 420000 - {.acode = 5, .lh = 1, .axis = 1, .window = CAPTURE_WINDOW, .offset = 4 * PULSE_WINDOW + 1 * CAPTURE_WINDOW,.is_sweep = 1}, // 440000 - - {.acode = 0, .lh = 0, .axis = 0, .window = PULSE_WINDOW, .offset = 4 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 800000 - {.acode = 4, .lh = 1, .axis = 0, .window = PULSE_WINDOW, .offset = 5 * PULSE_WINDOW + 2 * CAPTURE_WINDOW}, // 820000 - {.acode = 0, .lh = 0, .axis = 0, .window = CAPTURE_WINDOW, .offset = 6 * PULSE_WINDOW + 2 * CAPTURE_WINDOW,.is_sweep = 1}, // 840000 - - {.acode = 1, .lh = 0, .axis = 1, .window = PULSE_WINDOW, .offset = 6 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1200000 - {.acode = 5, .lh = 1, .axis = 1, .window = PULSE_WINDOW, .offset = 7 * PULSE_WINDOW + 3 * CAPTURE_WINDOW}, // 1220000 - {.acode = 1, .lh = 0, .axis = 1, .window = CAPTURE_WINDOW, .offset = 8 * PULSE_WINDOW + 3 * CAPTURE_WINDOW,.is_sweep = 1}, // 1240000 - - {.acode = -1, .lh = -1, .axis = -1, .window = -1, .offset = 8 * PULSE_WINDOW + 4 * CAPTURE_WINDOW} // 1600000 -}; -// clang-format on - -enum LighthouseState LighthouseState_findByOffset(int offset) { - for (int i = 2; i < LS_END + 1; i++) { - if (LS_Params[i].offset > offset) - return i - 1; - } - assert(false); - return -1; -} - -enum LightcapClassification { LCC_UNKNOWN = 0, LCC_SYNC = 1, LCC_SWEEP = 2 }; - -typedef struct { - LightcapElement history[NUM_HISTORY]; - enum LightcapClassification classifications[NUM_HISTORY]; - int idx; -} SensorHistory_t; - -typedef struct { - SurviveObject *so; - uint32_t time_of_last_sync[NUM_LIGHTHOUSES]; - - /** This part of the structure is general use when we know our state */ - uint32_t mod_offset; - enum LighthouseState state; - uint32_t last_state_transition_time; - int confidence; - uint32_t last_seen_time; - LightcapElement sweep_data[SENSORS_PER_OBJECT]; - - /** This rest of the structure is dedicated to finding a state when we are unknown */ - int encoded_acodes; - - /* Keep running average of sync signals as they come in */ - uint64_t last_sync_timestamp; - uint64_t last_sync_length; - int last_sync_count; - int stabalize; - bool lastWasSync; - SensorHistory_t histories[]; - -} Disambiguator_data_t; - -static uint32_t timestamp_diff(uint32_t recent, uint32_t prior) { - if (recent > prior) - return recent - prior; - return (0xFFFFFFFF - prior) + recent; -} - -static int find_acode(uint32_t pulseLen) { - const static int offset = 50; - if (pulseLen < 2500 + offset) - return -1; - - if (pulseLen < 3000 + offset) - return 0; - if (pulseLen < 3500 + offset) - return 1; - if (pulseLen < 4000 + offset) - return 2; - if (pulseLen < 4500 + offset) - return 3; - if (pulseLen < 5000 + offset) - return 4; - if (pulseLen < 5500 + offset) - return 5; - if (pulseLen < 6000 + offset) - return 6; - if (pulseLen < 6500 + offset) - return 7; - - return -1; -} - -static int circle_buffer_get(int idx, int offset) { return ((idx + offset) + NUM_HISTORY) % NUM_HISTORY; } - -static bool overlaps(const LightcapElement *a, const LightcapElement *b) { - int overlap = 0; - if (a->timestamp < b->timestamp && a->length + a->timestamp > b->timestamp) - overlap = a->length + a->timestamp - b->timestamp; - else if (b->timestamp < a->timestamp && b->length + b->timestamp > a->timestamp) - overlap = b->length + b->timestamp - a->timestamp; - - return overlap > a->length / 2; -} - -const int SKIP_BIT = 4; -const int DATA_BIT = 2; -const int AXIS_BIT = 1; - -#define LOWER_SYNC_TIME 2250 -#define UPPER_SYNC_TIME 6750 - -LightcapElement get_last_sync(Disambiguator_data_t *d) { - if (d->last_sync_count == 0) { - return (LightcapElement){0}; - } - - return (LightcapElement){.timestamp = (d->last_sync_timestamp + d->last_sync_count / 2) / d->last_sync_count, - .length = (d->last_sync_length + d->last_sync_count / 2) / d->last_sync_count, - .sensor_id = -d->last_sync_count}; -} - -static uint32_t next_sync_expected(Disambiguator_data_t *d) { - int acode = find_acode(get_last_sync(d).length); - if (acode & SKIP_BIT) - return get_last_sync(d).timestamp + 20000; - return get_last_sync(d).timestamp + 399840; -} - -static enum LightcapClassification classify(Disambiguator_data_t *d, SensorHistory_t *history, - const LightcapElement *le) { - bool clearlyNotSync = le->length < LOWER_SYNC_TIME || le->length > UPPER_SYNC_TIME; - - if (clearlyNotSync) { - return LCC_SWEEP; - } - - uint32_t time_diff_last_sync = timestamp_diff(le->timestamp, get_last_sync(d).timestamp); - uint32_t split_time = 399840; // 8.33ms in 48mhz - uint32_t jitter_allowance = 20000; - - // If we are ~8.33ms ahead of the last sync; we are a sync - if (get_last_sync(d).length > 0 && abs(timestamp_diff(le->timestamp, next_sync_expected(d))) < jitter_allowance) { - return LCC_SYNC; - } - - LightcapElement last_sync = get_last_sync(d); - if (get_last_sync(d).length > 0 && overlaps(&last_sync, le)) { - return LCC_SYNC; - } - - if (le->length > 2000) - return LCC_SYNC; - - if (get_last_sync(d).length > 0 && time_diff_last_sync < (split_time - jitter_allowance)) { - return LCC_SWEEP; - } - - int prevIdx = circle_buffer_get(history->idx, -1); - uint32_t time_diff = timestamp_diff(le->timestamp, history->history[prevIdx].timestamp); - - // We don't have recent data; unclear - if (time_diff > split_time) { - fprintf(stderr, "Time diff too high %d\n", time_diff); - return LCC_UNKNOWN; - } - - switch (history->classifications[prevIdx]) { - case LCC_SWEEP: - return LCC_SYNC; - } - fprintf(stderr, "last not sweep\n"); - return LCC_UNKNOWN; -} - -static enum LightcapClassification update_histories(Disambiguator_data_t *d, const LightcapElement *le) { - SensorHistory_t *history = &d->histories[le->sensor_id]; - - enum LightcapClassification classification = classify(d, history, le); - history->classifications[history->idx] = classification; - history->history[history->idx] = *le; - history->idx = (history->idx + 1) % NUM_HISTORY; - return classification; -} - -#define ACODE_TIMING(acode) \ - ((3000 + ((acode)&1) * 500 + (((acode) >> 1) & 1) * 1000 + (((acode) >> 2) & 1) * 2000) - 250) -#define ACODE(s, d, a) ((s << 2) | (d << 1) | a) -#define SWEEP 0xFF - -static uint32_t SolveForMod_Offset(Disambiguator_data_t *d, enum LighthouseState state, const LightcapElement *le) { - assert(LS_Params[state].is_sweep == 0); // Doesn't work for sweep data - SurviveContext *ctx = d->so->ctx; - DEBUG_TB("Solve for mod %d (%u - %u) = %u", state, le->timestamp, LS_Params[state].offset, - (le->timestamp - LS_Params[state].offset)); - - return (le->timestamp - LS_Params[state].offset); -} - -static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElement *le, - enum LighthouseState new_state); -static enum LighthouseState CheckEncodedAcode(Disambiguator_data_t *d, uint8_t newByte) { - SurviveContext *ctx = d->so->ctx; - d->encoded_acodes &= 0xFF; - d->encoded_acodes = (d->encoded_acodes << 8) | newByte; //(acode & (SKIP_BIT | AXIS_BIT)); - DEBUG_TB("0x%x", d->encoded_acodes); - LightcapElement lastSync = get_last_sync(d); - - switch (d->encoded_acodes) { - case (ACODE(0, 1, 0) << 8) | SWEEP: - d->mod_offset = SolveForMod_Offset(d, LS_SweepAX - 1, &lastSync); - - return (LS_SweepAX + 1); - case (ACODE(0, 1, 1) << 8) | SWEEP: - d->mod_offset = SolveForMod_Offset(d, LS_SweepAY - 1, &lastSync); - - return (LS_SweepAY + 1); - case (SWEEP << 8) | (ACODE(0, 1, 1)): - d->mod_offset = SolveForMod_Offset(d, LS_WaitLHB_ACode1, &lastSync); - - return (LS_WaitLHB_ACode1 + 1); - case (SWEEP << 8) | (ACODE(1, 1, 0)): - d->mod_offset = SolveForMod_Offset(d, LS_WaitLHA_ACode4, &lastSync); - - return (LS_WaitLHA_ACode4 + 1); - } - - return LS_UNKNOWN; -} -static enum LighthouseState EndSweep(Disambiguator_data_t *d, const LightcapElement *le) { - return CheckEncodedAcode(d, SWEEP); -} -static enum LighthouseState EndSync(Disambiguator_data_t *d, const LightcapElement *le) { - SurviveContext *ctx = d->so->ctx; - LightcapElement lastSync = get_last_sync(d); - int acode = find_acode(lastSync.length); - DEBUG_TB("!!%.03f(%d)\tacode: %d 0x%x a:%d d:%d s:%d (%d)", - timestamp_diff(le->timestamp, lastSync.timestamp) / 48000., - timestamp_diff(le->timestamp, lastSync.timestamp), lastSync.length, acode, acode & 1, (bool)(acode & 2), - (bool)(acode & 4), acode & (SKIP_BIT | AXIS_BIT)); - - if (acode > 0) { - return CheckEncodedAcode(d, (acode | DATA_BIT)); - } else { - d->encoded_acodes = 0; - } - return LS_UNKNOWN; -} - -static enum LighthouseState AttemptFindState(Disambiguator_data_t *d, const LightcapElement *le) { - enum LightcapClassification classification = update_histories(d, le); - - static uint32_t start = 0; - if (start == 0) - start = le->timestamp; - SurviveContext *ctx = d->so->ctx; - DEBUG_TB("%d(%.03f) %d Incoming %u %u", (le->timestamp - start), (le->timestamp - start) / 48000., classification, - le->timestamp, le->length); - - if (classification == LCC_SYNC) { - LightcapElement lastSync = get_last_sync(d); - - if (d->lastWasSync == false || overlaps(&lastSync, le) == false) { - - if (d->lastWasSync && timestamp_diff(lastSync.timestamp, le->timestamp) > 30000) { - // Missed a sweep window; clear encoded values. - SurviveContext *ctx = d->so->ctx; - // DEBUG_TB("Missed sweep window."); - d->encoded_acodes = 0; - } - - enum LighthouseState new_state = d->lastWasSync ? EndSync(d, le) : EndSweep(d, le); - - if (new_state != LS_UNKNOWN) - return new_state; - - d->last_sync_timestamp = le->timestamp; - d->last_sync_length = le->length; - d->last_sync_count = 1; - } else { - d->last_sync_timestamp += le->timestamp; - d->last_sync_length += le->length; - d->last_sync_count++; - } - - d->lastWasSync = true; - } else { - if (d->lastWasSync) { - enum LighthouseState new_state = EndSync(d, le); - if (new_state != LS_UNKNOWN) - return new_state; - } - d->lastWasSync = false; - } - - return LS_UNKNOWN; -} - -static enum LighthouseState SetState(Disambiguator_data_t *d, const LightcapElement *le, - enum LighthouseState new_state) { - - SurviveContext *ctx = d->so->ctx; - if (new_state >= LS_END) - new_state = 1; - - d->encoded_acodes = 0; - DEBUG_TB("State transition %d -> %d at %u(%.03f)", d->state, new_state, le->timestamp, - timestamp_diff(d->last_state_transition_time, le->timestamp) / 480000.); - - d->state = new_state; - d->last_state_transition_time = le->timestamp; - - d->last_sync_timestamp = d->last_sync_length = d->last_sync_count = 0; - memset(d->sweep_data, 0, sizeof(LightcapElement) * SENSORS_PER_OBJECT); - - return new_state; -} - -static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le); -static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const LightcapElement *le) { - if (le->length < 100) - return; - - int acode = find_acode(le->length); - SurviveContext *ctx = d->so->ctx; - - uint32_t time_error_d0 = abs(ACODE_TIMING(target_acode) - le->length); - uint32_t time_error_d1 = abs(ACODE_TIMING(target_acode | DATA_BIT) - le->length); - uint32_t error = time_error_d0 > time_error_d1 ? time_error_d1 : time_error_d0; - - DEBUG_TB("acode %d %d 0x%x (%d)", target_acode, le->length, acode, error); - if (error > 1250) { - if (d->confidence < 3) { - SetState(d, le, LS_UNKNOWN); - // assert(false); - SV_INFO("WARNING: Disambiguator got lost; refinding state."); - } - d->confidence -= 3; - return; - } - - if (d->confidence < 100) - d->confidence++; - d->last_sync_timestamp += le->timestamp; - d->last_sync_length += le->length; - d->last_sync_count++; -} - -static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { - int le_offset = le->timestamp > d->mod_offset - ? (le->timestamp - d->mod_offset + 10000) % LS_Params[LS_END].offset - : (0xFFFFFFFF - d->mod_offset + le->timestamp + 10000) % LS_Params[LS_END].offset; - - enum LighthouseState new_state = LighthouseState_findByOffset(le_offset); - SurviveContext *ctx = d->so->ctx; - DEBUG_TB("new %u %d %d %d %d", le->timestamp, le->length, le_offset, LS_Params[d->state].offset, - LS_Params[new_state].offset); - - if (d->state != new_state) { - static uint64_t sync2syncs[LS_END] = {0}; - static uint64_t sync2syncsCnt[LS_END] = {0}; - - if (LS_Params[d->state].is_sweep == 0) { - if (d->last_sync_count > 0) { - LightcapElement lastSync = get_last_sync(d); - uint32_t mo = SolveForMod_Offset(d, d->state, &lastSync); - DEBUG_TB("New mod offset diff %d %u", (int)d->mod_offset - (int)mo, mo); - d->mod_offset = mo; - - int lengthData = ACODE_TIMING(LS_Params[d->state].acode | DATA_BIT); - int lengthNoData = ACODE_TIMING(LS_Params[d->state].acode); - - bool hasData = abs(lengthData - lastSync.length) < abs(lengthNoData - lastSync.length); - int acode = LS_Params[d->state].acode; - if (hasData) - acode |= DATA_BIT; - - ctx->lightproc(d->so, -LS_Params[d->state].lh - 1, acode, 0, lastSync.timestamp, lastSync.length, - LS_Params[d->state].lh); - d->time_of_last_sync[LS_Params[d->state].lh] = lastSync.timestamp; - } - } else { - for (int i = 0; i < SENSORS_PER_OBJECT; i++) { - LightcapElement le = d->sweep_data[i]; - if (le.length > 0 && d->time_of_last_sync[LS_Params[d->state].lh] > 0) { - int32_t offset_from = - timestamp_diff(le.timestamp + le.length / 2, d->time_of_last_sync[LS_Params[d->state].lh]); - assert(offset_from > 0); - d->so->ctx->lightproc(d->so, i, LS_Params[d->state].acode, offset_from, le.timestamp, le.length, - LS_Params[d->state].lh); - } - } - } - - SetState(d, le, new_state); - } - - const LighthouseStateParameters *param = &LS_Params[d->state]; - if (param->is_sweep == 0) { - RunACodeCapture(param->acode, d, le); - } else { - if (le->length > d->sweep_data[le->sensor_id].length) { - d->sweep_data[le->sensor_id] = *le; - } - } -} - -void DisambiguatorTimeBased(SurviveObject *so, const LightcapElement *le) { - SurviveContext *ctx = so->ctx; - - // Note, this happens if we don't have config yet -- just bail - if (so->sensor_ct == 0) { - return; - } - - if (so->disambiguator_data == NULL) { - DEBUG_TB("Initializing Disambiguator Data for TB %d", so->sensor_ct); - Disambiguator_data_t *d = calloc(1, sizeof(Disambiguator_data_t) + sizeof(SensorHistory_t) * so->sensor_ct); - d->so = so; - so->disambiguator_data = d; - } - - Disambiguator_data_t *d = so->disambiguator_data; - // It seems like the first few hundred lightcapelements are missing a ton of data; let it stabilize. - if (d->stabalize < 200) { - d->stabalize++; - return; - } - - if (d->state == LS_UNKNOWN) { - enum LighthouseState new_state = AttemptFindState(d, le); - if (new_state != LS_UNKNOWN) { - LightcapElement lastSync = get_last_sync(d); - d->confidence = 0; - - int le_offset = (le->timestamp - d->mod_offset) % LS_Params[LS_END].offset; - enum LighthouseState new_state1 = LighthouseState_findByOffset(le_offset); - SetState(d, le, new_state1); - DEBUG_TB("Locked onto state %d(%d, %d) at %u", new_state, new_state1, le_offset, d->mod_offset); - } - } else { - PropagateState(d, le); - } -} - -REGISTER_LINKTIME(DisambiguatorTimeBased); -- cgit v1.2.3 From ef18541ac2e1e97de9f04f132ac7b2b1ba21e515 Mon Sep 17 00:00:00 2001 From: dpeter99 Date: Wed, 28 Mar 2018 17:34:56 +0200 Subject: c# binding WIP --- csharp-binding/LibSurviveBinding.sln | 25 ++++++++ csharp-binding/LibSurviveBinding/Binding.cs | 33 ++++++++++ csharp-binding/LibSurviveBinding/Config_entry.cs | 31 +++++++++ .../LibSurviveBinding/LibSurviveBinding.csproj | 14 ++++ .../LibSurviveBinding/LightcapElement.cs | 6 ++ csharp-binding/LibSurviveBinding/Program.cs | 71 +++++++++++++++++++++ csharp-binding/LibSurviveBinding/SurviveContext.cs | 44 +++++++++++++ csharp-binding/LibSurviveBinding/SurviveObject.cs | 6 ++ csharp-binding/LibSurviveBinding/SurvivePose.cs | 6 ++ .../bin/Debug/netcoreapp2.0/LibSurviveBinding.dll | Bin 0 -> 8192 bytes .../bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb | Bin 0 -> 1044 bytes .../bin/Debug/netcoreapp2.0/libsurvive.dll | Bin 0 -> 365056 bytes csharp-binding/LibSurviveBinding/config_group.cs | 14 ++++ csharp-binding/LibSurviveBinding/libsurvive.dll | Bin 0 -> 365056 bytes .../LibSurviveBinding.AssemblyInfo.cs | 23 +++++++ .../LibSurviveBinding.AssemblyInfoInputs.cache | 1 + ...ibSurviveBinding.csproj.CoreCompileInputs.cache | 1 + .../LibSurviveBinding.csproj.FileListAbsolute.txt | 12 ++++ ...iveBinding.csprojResolveAssemblyReference.cache | Bin 0 -> 480497 bytes .../obj/Debug/netcoreapp2.0/LibSurviveBinding.dll | Bin 0 -> 8192 bytes .../obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb | Bin 0 -> 1044 bytes .../obj/LibSurviveBinding.csproj.nuget.cache | 5 ++ .../obj/LibSurviveBinding.csproj.nuget.g.props | 18 ++++++ .../obj/LibSurviveBinding.csproj.nuget.g.targets | 10 +++ 24 files changed, 320 insertions(+) create mode 100644 csharp-binding/LibSurviveBinding.sln create mode 100644 csharp-binding/LibSurviveBinding/Binding.cs create mode 100644 csharp-binding/LibSurviveBinding/Config_entry.cs create mode 100644 csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj create mode 100644 csharp-binding/LibSurviveBinding/LightcapElement.cs create mode 100644 csharp-binding/LibSurviveBinding/Program.cs create mode 100644 csharp-binding/LibSurviveBinding/SurviveContext.cs create mode 100644 csharp-binding/LibSurviveBinding/SurviveObject.cs create mode 100644 csharp-binding/LibSurviveBinding/SurvivePose.cs create mode 100644 csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll create mode 100644 csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb create mode 100644 csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll create mode 100644 csharp-binding/LibSurviveBinding/config_group.cs create mode 100644 csharp-binding/LibSurviveBinding/libsurvive.dll create mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs create mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache create mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache create mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt create mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache create mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll create mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb create mode 100644 csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache create mode 100644 csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props create mode 100644 csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets diff --git a/csharp-binding/LibSurviveBinding.sln b/csharp-binding/LibSurviveBinding.sln new file mode 100644 index 0000000..539470c --- /dev/null +++ b/csharp-binding/LibSurviveBinding.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27428.2015 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibSurviveBinding", "LibSurviveBinding\LibSurviveBinding.csproj", "{3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CA47A8D6-3379-4ABA-927E-86BBDDE1D304} + EndGlobalSection +EndGlobal diff --git a/csharp-binding/LibSurviveBinding/Binding.cs b/csharp-binding/LibSurviveBinding/Binding.cs new file mode 100644 index 0000000..f4f0652 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/Binding.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LibSurviveBinding +{ + class Binding + { + /* + typedef int (* htc_config_func) (SurviveObject* so, char* ct0conf, int len); + typedef void (* text_feedback_func) (SurviveContext* ctx, const char* fault ); + typedef void (* light_process_func) (SurviveObject* so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, uint32_t lighthouse); + typedef void (* imu_process_func) (SurviveObject* so, int mask, FLT* accelgyro, uint32_t timecode, int id); + typedef void (* angle_process_func) (SurviveObject* so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh); + typedef void (* button_process_func) (SurviveObject* so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); + typedef void (* raw_pose_func) (SurviveObject* so, uint8_t lighthouse, SurvivePose* pose); + typedef void (* lighthouse_pose_func) (SurviveContext* ctx, uint8_t lighthouse, SurvivePose* lighthouse_pose, + SurvivePose* object_pose); + */ + } + + public delegate int htc_config_func(IntPtr so, char ct0conf, int len); + public delegate void text_feedback_func(IntPtr ctx, string fault); + public delegate void light_process_func(IntPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse); + public delegate void imu_process_func(IntPtr so, int mask, double accelgyro, UInt32 timecode, int id); + public delegate void angle_process_func(IntPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); + public delegate void button_process_func(IntPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); + public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); + public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, + IntPtr object_pose); + public delegate void handle_lightcap_func (IntPtr so, IntPtr le); + +} diff --git a/csharp-binding/LibSurviveBinding/Config_entry.cs b/csharp-binding/LibSurviveBinding/Config_entry.cs new file mode 100644 index 0000000..85a6701 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/Config_entry.cs @@ -0,0 +1,31 @@ +namespace LibSurviveBinding +{ + + // internal class Config_entry + // { + // char[] tag; + // cval_type type; + // /** + // union { + //uint32_t i; + // FLT f; + // } + + // numeric; + // **/ + // char* data; + // uint32_t elements; + + // } + + // public enum cval_type + // { + // CONFIG_UNKNOWN = 0, + // CONFIG_FLOAT = 1, + // CONFIG_UINT32 = 2, + // CONFIG_STRING = 3, + // CONFIG_FLOAT_ARRAY = 4, + // } + + +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj b/csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj new file mode 100644 index 0000000..e3be07c --- /dev/null +++ b/csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp2.0 + + + + + Always + + + + diff --git a/csharp-binding/LibSurviveBinding/LightcapElement.cs b/csharp-binding/LibSurviveBinding/LightcapElement.cs new file mode 100644 index 0000000..ca51fb9 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/LightcapElement.cs @@ -0,0 +1,6 @@ +namespace LibSurviveBinding +{ + public class LightcapElement + { + } +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/Program.cs b/csharp-binding/LibSurviveBinding/Program.cs new file mode 100644 index 0000000..7ae8e76 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/Program.cs @@ -0,0 +1,71 @@ +using System; +using System.Runtime.InteropServices; + +namespace LibSurVive +{ + class Program + { + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern IntPtr survive_init_internal(int argc, char[] args); + + public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); + public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose); + + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern void survive_install_raw_pose_fn(IntPtr ctx, raw_pose_func fbp); + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern void survive_install_lighthouse_pose_fn(IntPtr ctx, lighthouse_pose_func fbp); + + + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern int survive_startup(IntPtr ctx); + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern void survive_cal_install(IntPtr ctx); + + public static lighthouse_pose_func lighthouse_Pose_Func { get; private set; } + public static raw_pose_func raw_Pose_Func { get; private set; } + + static void Main(string[] args) + { + IntPtr context = survive_init_internal(0, null); + + lighthouse_Pose_Func = LighthousPos; + survive_install_lighthouse_pose_fn(context, lighthouse_Pose_Func); + raw_Pose_Func = PositionUpdate; + survive_install_raw_pose_fn(context, raw_Pose_Func); + + try + { + int a = survive_startup(context); + //survive_cal_install(context); + } + catch (Exception) + { + + throw; + } + + bool running = true; + + + + Console.WriteLine("Hello World!"); + + while (running) + { + Console.ReadLine(); + } + + } + + public static void PositionUpdate(IntPtr so, byte lighthouse, IntPtr pose) + { + //Console.WriteLine(pose); + } + + public static void LighthousPos(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose) + { + + } + } +} diff --git a/csharp-binding/LibSurviveBinding/SurviveContext.cs b/csharp-binding/LibSurviveBinding/SurviveContext.cs new file mode 100644 index 0000000..2ba9b7c --- /dev/null +++ b/csharp-binding/LibSurviveBinding/SurviveContext.cs @@ -0,0 +1,44 @@ +namespace LibSurviveBinding +{ + /* + public struct SurviveContext + { + text_feedback_func faultfunction; + text_feedback_func notefunction; + light_process_func lightproc; + imu_process_func imuproc; + angle_process_func angleproc; + button_process_func buttonproc; + raw_pose_func rawposeproc; + lighthouse_pose_func lighthouseposeproc; + htc_config_func configfunction; + handle_lightcap_func lightcapfunction; + + Config_group global_config_values; + Config_group* lh_config; //lighthouse configs + Config_group* temporary_config_values; //Set per-session, from command-line. Not saved but override global_config_values + + //Calibration data: + int activeLighthouses; + BaseStationData bsd[NUM_LIGHTHOUSES]; + SurviveCalData* calptr; //If and only if the calibration subsystem is attached. + struct SurviveRecordingData *recptr; // Iff recording is attached + SurviveObject** objs; + int objs_ct; + + void** drivers; + DeviceDriverCb* driverpolls; + DeviceDriverCb* drivercloses; + DeviceDriverMagicCb* drivermagics; + int driver_ct; + + SurviveState state; + + void* buttonservicethread; + ButtonQueue buttonQueue; + + void* user_ptr; + + } + */ +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/SurviveObject.cs b/csharp-binding/LibSurviveBinding/SurviveObject.cs new file mode 100644 index 0000000..bb9e3cd --- /dev/null +++ b/csharp-binding/LibSurviveBinding/SurviveObject.cs @@ -0,0 +1,6 @@ +namespace LibSurviveBinding +{ + public class SurviveObject + { + } +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/SurvivePose.cs b/csharp-binding/LibSurviveBinding/SurvivePose.cs new file mode 100644 index 0000000..9808d89 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/SurvivePose.cs @@ -0,0 +1,6 @@ +namespace LibSurviveBinding +{ + public class SurvivePose + { + } +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll new file mode 100644 index 0000000..08f1a10 Binary files /dev/null and b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll differ diff --git a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb new file mode 100644 index 0000000..c8442a1 Binary files /dev/null and b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb differ diff --git a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll new file mode 100644 index 0000000..09738c8 Binary files /dev/null and b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll differ diff --git a/csharp-binding/LibSurviveBinding/config_group.cs b/csharp-binding/LibSurviveBinding/config_group.cs new file mode 100644 index 0000000..8a2f00e --- /dev/null +++ b/csharp-binding/LibSurviveBinding/config_group.cs @@ -0,0 +1,14 @@ +using System; + +namespace LibSurviveBinding +{ + /* + internal class Config_group + { + Config_entry config_entries; + UInt16 used_entries; + UInt16 max_entries; + + } + */ +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/libsurvive.dll b/csharp-binding/LibSurviveBinding/libsurvive.dll new file mode 100644 index 0000000..09738c8 Binary files /dev/null and b/csharp-binding/LibSurviveBinding/libsurvive.dll differ diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs new file mode 100644 index 0000000..0c76a75 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("LibSurviveBinding")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("LibSurviveBinding")] +[assembly: System.Reflection.AssemblyTitleAttribute("LibSurviveBinding")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache new file mode 100644 index 0000000..27570f7 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +b297cfadb5fc15fdc85ac80d1db8dc47ecc7fa1f diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..d7b7e81 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +e5ec51aa179849bdaf5ff16a14a375413f2f7a0b diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..a699d0e --- /dev/null +++ b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt @@ -0,0 +1,12 @@ +P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.deps.json +P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.runtimeconfig.json +P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.runtimeconfig.dev.json +P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.dll +P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.pdb +P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.csprojResolveAssemblyReference.cache +P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.csproj.CoreCompileInputs.cache +P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.AssemblyInfoInputs.cache +P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.AssemblyInfo.cs +P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.dll +P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.pdb +P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\libsurvive.dll diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..94b7814 Binary files /dev/null and b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache differ diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll new file mode 100644 index 0000000..08f1a10 Binary files /dev/null and b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll differ diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb new file mode 100644 index 0000000..c8442a1 Binary files /dev/null and b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb differ diff --git a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache new file mode 100644 index 0000000..55c49f2 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache @@ -0,0 +1,5 @@ +{ + "version": 1, + "dgSpecHash": "WfCkKm3U/vtoEsgbYzrhLfrfUejWLQZtOI4PCmuZ/c/RM+JDSQotxYTHxQQ6Blgu3cg1aVoZ15gcgmVkgjRwSg==", + "success": true +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props new file mode 100644 index 0000000..f4fbbaa --- /dev/null +++ b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + P:\csharp\LibSurviveBinding\obj\project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Peter\.nuget\packages\;C:\Program Files\dotnet\sdk\NuGetFallbackFolder + PackageReference + 4.6.1 + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets new file mode 100644 index 0000000..91fd1c9 --- /dev/null +++ b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets @@ -0,0 +1,10 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + + \ No newline at end of file -- cgit v1.2.3 From b371fd666300279ef9a519d9d2bf0cbbdbffee1c Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 10:35:09 -0600 Subject: Added ability to specify covariance of meas --- src/poser_sba.c | 182 ++++++++++++++++---------------------------------------- 1 file changed, 52 insertions(+), 130 deletions(-) diff --git a/src/poser_sba.c b/src/poser_sba.c index 8fa8c08..0ad38ac 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -33,16 +33,22 @@ typedef struct { typedef struct SBAData { int last_acode; int last_lh; + int failures_to_reset; int failures_to_reset_cntr; int successes_to_reset; int successes_to_reset_cntr; + FLT sensor_variance; + FLT sensor_variance_per_second; + int sensor_time_window; + int required_meas; + SurviveObject *so; } SBAData; -void metric_function(int j, int i, double *aj, double *xij, void *adata) { +static void metric_function(int j, int i, double *aj, double *xij, void *adata) { sba_context *ctx = (sba_context *)(adata); SurviveObject *so = ctx->so; @@ -53,7 +59,7 @@ void metric_function(int j, int i, double *aj, double *xij, void *adata) { xij); } -size_t construct_input(const SurviveObject *so, PoserDataFullScene *pdfs, char *vmask, double *meas) { +static size_t construct_input(const SurviveObject *so, PoserDataFullScene *pdfs, char *vmask, double *meas) { size_t measCount = 0; size_t size = so->sensor_ct * NUM_LIGHTHOUSES; // One set per lighthouse for (size_t sensor = 0; sensor < so->sensor_ct; sensor++) { @@ -74,35 +80,27 @@ size_t construct_input(const SurviveObject *so, PoserDataFullScene *pdfs, char * return measCount; } -size_t construct_input_from_scene_single_sweep(const SurviveObject *so, PoserDataLight *pdl, - SurviveSensorActivations *scene, char *vmask, double *meas, int acode, - int lh) { - size_t rtn = 0; - - for (size_t sensor = 0; sensor < so->sensor_ct; sensor++) { - const uint32_t *data_timecode = scene->timecode[sensor][lh]; - if (pdl->timecode - data_timecode[acode & 1] <= SurviveSensorActivations_default_tolerance) { - double *a = scene->angles[sensor][lh]; - vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; - meas[rtn++] = a[acode & 0x1]; - } else { - vmask[sensor * NUM_LIGHTHOUSES + lh] = 0; - } - } - - return rtn; -} - -size_t construct_input_from_scene(const SurviveObject *so, PoserDataLight *pdl, SurviveSensorActivations *scene, - char *vmask, double *meas) { +static size_t construct_input_from_scene(SBAData *d, PoserDataLight *pdl, SurviveSensorActivations *scene, char *vmask, + double *meas, double *cov) { size_t rtn = 0; + SurviveObject *so = d->so; for (size_t sensor = 0; sensor < so->sensor_ct; sensor++) { for (size_t lh = 0; lh < 2; lh++) { - if (SurviveSensorActivations_isPairValid(scene, SurviveSensorActivations_default_tolerance, pdl->timecode, - sensor, lh)) { + if (SurviveSensorActivations_isPairValid(scene, d->sensor_time_window, pdl->timecode, sensor, lh)) { double *a = scene->angles[sensor][lh]; vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; + + if (cov) { + *(cov++) = d->sensor_variance + + abs(pdl->timecode - scene->timecode[sensor][lh][0]) * d->sensor_variance_per_second / + (double)so->timebase_hz; + *(cov++) = 0; + *(cov++) = 0; + *(cov++) = d->sensor_variance + + abs(pdl->timecode - scene->timecode[sensor][lh][1]) * d->sensor_variance_per_second / + (double)so->timebase_hz; + } meas[rtn++] = a[0]; meas[rtn++] = a[1]; } else { @@ -127,7 +125,7 @@ typedef struct { SurvivePose poses; } sba_set_position_t; -void sba_set_position(SurviveObject *so, uint8_t lighthouse, SurvivePose *new_pose, void *_user) { +static void sba_set_position(SurviveObject *so, uint8_t lighthouse, SurvivePose *new_pose, void *_user) { sba_set_position_t *user = _user; assert(user->hasInfo == false); user->hasInfo = 1; @@ -135,7 +133,7 @@ void sba_set_position(SurviveObject *so, uint8_t lighthouse, SurvivePose *new_po } void *GetDriver(const char *name); -void str_metric_function_single_sweep(int j, int i, double *bi, double *xij, void *adata) { +static void str_metric_function_single_sweep(int j, int i, double *bi, double *xij, void *adata) { SurvivePose obj = *(SurvivePose *)bi; int sensor_idx = j >> 1; @@ -159,7 +157,7 @@ void str_metric_function_single_sweep(int j, int i, double *bi, double *xij, voi *xij = out[acode]; } -void str_metric_function(int j, int i, double *bi, double *xij, void *adata) { +static void str_metric_function(int j, int i, double *bi, double *xij, void *adata) { SurvivePose obj = *(SurvivePose *)bi; int sensor_idx = j >> 1; int lh = j & 1; @@ -178,111 +176,18 @@ void str_metric_function(int j, int i, double *bi, double *xij, void *adata) { SurvivePose *camera = &so->ctx->bsd[lh].Pose; survive_reproject_from_pose_with_config(so->ctx, &ctx->calibration_config, lh, camera, xyz, xij); } -#if 0 -static double run_sba_find_3d_structure_single_sweep(survive_calibration_config options, PoserDataLight *pdl, - SurviveObject *so, SurviveSensorActivations *scene, int acode, - int lh, int max_iterations /* = 50*/, - double max_reproj_error /* = 0.005*/) { - double *covx = 0; - - char *vmask = alloca(sizeof(char) * so->sensor_ct); - double *meas = alloca(sizeof(double) * so->sensor_ct); - size_t meas_size = construct_input_from_scene_single_sweep(so, pdl, scene, vmask, meas, acode, lh); - - static int failure_count = 500; - - if (so->ctx->bsd[0].PositionSet == 0 || so->ctx->bsd[1].PositionSet == 0 || meas_size < d->required_meas) { - if (so->ctx->bsd[0].PositionSet && so->ctx->bsd[1].PositionSet && failure_count++ == 500) { - SurviveContext *ctx = so->ctx; - SV_INFO("Can't solve for position with just %u measurements", (unsigned int)meas_size); - failure_count = 0; - } - return -1; - } - failure_count = 0; - - SurvivePose soLocation = so->OutPose; - bool currentPositionValid = quatmagnitude(&soLocation.Rot[0]); - - { - const char *subposer = config_read_str(so->ctx->global_config_values, "SBASeedPoser", "PoserEPNP"); - PoserCB driver = (PoserCB)GetDriver(subposer); - SurviveContext *ctx = so->ctx; - if (driver) { - PoserData hdr = pdl->hdr; - memset(&pdl->hdr, 0, sizeof(pdl->hdr)); // Clear callback functions - pdl->hdr.pt = hdr.pt; - pdl->hdr.rawposeproc = sba_set_position; - - sba_set_position_t locations = {0}; - pdl->hdr.userdata = &locations; - driver(so, &pdl->hdr); - pdl->hdr = hdr; - - if (locations.hasInfo == false) { - return -1; - } else if (locations.hasInfo) { - soLocation = locations.poses; - } - } else { - SV_INFO("Not using a seed poser for SBA; results will likely be way off"); - } - } - - double opts[SBA_OPTSSZ] = {0}; - double info[SBA_INFOSZ] = {0}; - - sba_context_single_sweep ctx = {.hdr = {options, &pdl->hdr, so}, .acode = acode, .lh = lh}; - - opts[0] = SBA_INIT_MU; - opts[1] = SBA_STOP_THRESH; - opts[2] = SBA_STOP_THRESH; - opts[3] = SBA_STOP_THRESH; - opts[3] = SBA_STOP_THRESH; // max_reproj_error * meas.size(); - opts[4] = 0.0; - - int status = sba_str_levmar(1, // Number of 3d points - 0, // Number of 3d points to fix in spot - so->sensor_ct, vmask, - soLocation.Pos, // Reads as the full pose though - 7, // pnp -- SurvivePose - meas, // x* -- measurement data - 0, // cov data - 1, // mnp -- 2 points per image - str_metric_function_single_sweep, - 0, // jacobia of metric_func - &ctx, // user data - max_iterations, // Max iterations - 0, // verbosity - opts, // options - info); // info - - if (status > 0) { - quatnormalize(soLocation.Rot, soLocation.Rot); - PoserData_poser_raw_pose_func(&pdl->hdr, so, 1, &soLocation); - - SurviveContext *ctx = so->ctx; - // Docs say info[0] should be divided by meas; I don't buy it really... - static int cnt = 0; - if (cnt++ > 1000 || meas_size < d->required_meas) { - SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (unsigned int)meas_size); - SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); - cnt = 0; - } - } - - return info[1] / meas_size * 2; -} -#endif static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config options, PoserDataLight *pdl, - SurviveObject *so, SurviveSensorActivations *scene, - int max_iterations /* = 50*/, double max_reproj_error /* = 0.005*/) { + SurviveSensorActivations *scene, int max_iterations /* = 50*/, + double max_reproj_error /* = 0.005*/) { double *covx = 0; + SurviveObject *so = d->so; char *vmask = alloca(sizeof(char) * so->sensor_ct * NUM_LIGHTHOUSES); double *meas = alloca(sizeof(double) * 2 * so->sensor_ct * NUM_LIGHTHOUSES); - size_t meas_size = construct_input_from_scene(so, pdl, scene, vmask, meas); + double *cov = + d->sensor_variance_per_second > 0. ? alloca(sizeof(double) * 2 * 2 * so->sensor_ct * NUM_LIGHTHOUSES) : 0; + size_t meas_size = construct_input_from_scene(d, pdl, scene, vmask, meas, cov); static int failure_count = 500; bool hasAllBSDs = true; @@ -349,7 +254,7 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o soLocation.Pos, // Reads as the full pose though 7, // pnp -- SurvivePose meas, // x* -- measurement data - 0, // cov data + cov, // cov data 2, // mnp -- 2 points per image str_metric_function, 0, // jacobia of metric_func @@ -359,6 +264,14 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o opts, // options info); // info + if (currentPositionValid) { + FLT distp[3]; + sub3d(distp, so->OutPose.Pos, soLocation.Pos); + FLT distance = magnitude3d(distp); + ; + if (distance > 1.) + status = -1; + } if (status > 0) { d->failures_to_reset_cntr = d->failures_to_reset; quatnormalize(soLocation.Rot, soLocation.Rot); @@ -479,7 +392,16 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { d->required_meas = survive_configi(ctx, "sba-required-meas", SC_GET, 8); - SV_INFO("Initializing SBA with %d required measurements", d->required_meas); + d->sensor_time_window = survive_configi(ctx, "sba-time-window", SC_GET, 1600000 * 4); + d->sensor_variance_per_second = survive_configf(ctx, "sba-sensor-variance-per-sec", SC_GET, 0.001); + d->sensor_variance = survive_configf(ctx, "sba-sensor-variance", SC_GET, 1.0); + d->so = so; + + SV_INFO("Initializing SBA:"); + SV_INFO("\tsba-required-meas: %d", d->required_meas); + SV_INFO("\tsba-sensor-variance: %f", d->sensor_variance); + SV_INFO("\tsba-sensor-variance-per-sec: %f", d->sensor_variance_per_second); + SV_INFO("\tsba-time-window: %d", d->sensor_time_window); } SBAData *d = so->PoserData; switch (pd->pt) { @@ -494,7 +416,7 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { FLT error = -1; if (d->last_lh != lightData->lh || d->last_acode != lightData->acode) { survive_calibration_config config = *survive_calibration_default_config(); - error = run_sba_find_3d_structure(d, config, lightData, so, scene, 50, .5); + error = run_sba_find_3d_structure(d, config, lightData, scene, 50, .5); d->last_lh = lightData->lh; d->last_acode = lightData->acode; } -- cgit v1.2.3 From 3c4e37a277745cb22e7a4b1b7337f64fd653c205 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 10:35:23 -0600 Subject: Prettier word wrap --- tools/viz/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/viz/index.html b/tools/viz/index.html index 0221b41..2987555 100644 --- a/tools/viz/index.html +++ b/tools/viz/index.html @@ -26,6 +26,7 @@ position: absolute; bottom: 20px; overflow: auto; + white-space: pre-wrap; background-color: rgba(0,200,200, .25); z-index: 3;"> -- cgit v1.2.3 From 8a6be7bacaa8858f8e493a696d3c2cff563851d7 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 10:37:19 -0600 Subject: Reverted change to makefile which enabled additional warnings --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ee55a2d..c73f139 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all : lib data_recorder test calibrate calibrate_client simple_pose_test CC?=gcc -CFLAGS:=-Iinclude/libsurvive -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm -fsanitize=address -fsanitize=undefined -Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable -Wno-pointer-sign -Wno-parentheses +CFLAGS:=-Iinclude/libsurvive -fPIC -g -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm #-fsanitize=address -fsanitize=undefined -Wall -Wno-unused-variable -Wno-switch -Wno-unused-but-set-variable -Wno-pointer-sign -Wno-parentheses CFLAGS_RELEASE:=-Iinclude/libsurvive -fPIC -msse2 -ftree-vectorize -O3 -Iredist -flto -DUSE_DOUBLE -std=gnu99 -rdynamic -llapacke -lcblas -lm -- cgit v1.2.3 From 70596acbbe766045c95f64a65b411d4cd7584918 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 16:34:33 -0600 Subject: Slight refactoring --- bindings/cs/.gitignore | 3 + bindings/cs/LibSurviveBinding.sln | 25 ++++++++ bindings/cs/LibSurviveBinding/Binding.cs | 33 ++++++++++ bindings/cs/LibSurviveBinding/Config_entry.cs | 31 +++++++++ .../cs/LibSurviveBinding/LibSurviveBinding.csproj | 18 ++++++ bindings/cs/LibSurviveBinding/LightcapElement.cs | 6 ++ bindings/cs/LibSurviveBinding/Program.cs | 62 ++++++++++++++++++ bindings/cs/LibSurviveBinding/SurviveContext.cs | 44 +++++++++++++ bindings/cs/LibSurviveBinding/SurviveObject.cs | 6 ++ bindings/cs/LibSurviveBinding/SurvivePose.cs | 6 ++ bindings/cs/LibSurviveBinding/config_group.cs | 14 ++++ csharp-binding/LibSurviveBinding.sln | 25 -------- csharp-binding/LibSurviveBinding/Binding.cs | 33 ---------- csharp-binding/LibSurviveBinding/Config_entry.cs | 31 --------- .../LibSurviveBinding/LibSurviveBinding.csproj | 14 ---- .../LibSurviveBinding/LightcapElement.cs | 6 -- csharp-binding/LibSurviveBinding/Program.cs | 71 --------------------- csharp-binding/LibSurviveBinding/SurviveContext.cs | 44 ------------- csharp-binding/LibSurviveBinding/SurviveObject.cs | 6 -- csharp-binding/LibSurviveBinding/SurvivePose.cs | 6 -- .../bin/Debug/netcoreapp2.0/LibSurviveBinding.dll | Bin 8192 -> 0 bytes .../bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb | Bin 1044 -> 0 bytes .../bin/Debug/netcoreapp2.0/libsurvive.dll | Bin 365056 -> 0 bytes csharp-binding/LibSurviveBinding/config_group.cs | 14 ---- csharp-binding/LibSurviveBinding/libsurvive.dll | Bin 365056 -> 0 bytes .../LibSurviveBinding.AssemblyInfo.cs | 23 ------- .../LibSurviveBinding.AssemblyInfoInputs.cache | 1 - ...ibSurviveBinding.csproj.CoreCompileInputs.cache | 1 - .../LibSurviveBinding.csproj.FileListAbsolute.txt | 12 ---- ...iveBinding.csprojResolveAssemblyReference.cache | Bin 480497 -> 0 bytes .../obj/Debug/netcoreapp2.0/LibSurviveBinding.dll | Bin 8192 -> 0 bytes .../obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb | Bin 1044 -> 0 bytes .../obj/LibSurviveBinding.csproj.nuget.cache | 5 -- .../obj/LibSurviveBinding.csproj.nuget.g.props | 18 ------ .../obj/LibSurviveBinding.csproj.nuget.g.targets | 10 --- 35 files changed, 248 insertions(+), 320 deletions(-) create mode 100644 bindings/cs/.gitignore create mode 100644 bindings/cs/LibSurviveBinding.sln create mode 100644 bindings/cs/LibSurviveBinding/Binding.cs create mode 100644 bindings/cs/LibSurviveBinding/Config_entry.cs create mode 100644 bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj create mode 100644 bindings/cs/LibSurviveBinding/LightcapElement.cs create mode 100644 bindings/cs/LibSurviveBinding/Program.cs create mode 100644 bindings/cs/LibSurviveBinding/SurviveContext.cs create mode 100644 bindings/cs/LibSurviveBinding/SurviveObject.cs create mode 100644 bindings/cs/LibSurviveBinding/SurvivePose.cs create mode 100644 bindings/cs/LibSurviveBinding/config_group.cs delete mode 100644 csharp-binding/LibSurviveBinding.sln delete mode 100644 csharp-binding/LibSurviveBinding/Binding.cs delete mode 100644 csharp-binding/LibSurviveBinding/Config_entry.cs delete mode 100644 csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj delete mode 100644 csharp-binding/LibSurviveBinding/LightcapElement.cs delete mode 100644 csharp-binding/LibSurviveBinding/Program.cs delete mode 100644 csharp-binding/LibSurviveBinding/SurviveContext.cs delete mode 100644 csharp-binding/LibSurviveBinding/SurviveObject.cs delete mode 100644 csharp-binding/LibSurviveBinding/SurvivePose.cs delete mode 100644 csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll delete mode 100644 csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb delete mode 100644 csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll delete mode 100644 csharp-binding/LibSurviveBinding/config_group.cs delete mode 100644 csharp-binding/LibSurviveBinding/libsurvive.dll delete mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs delete mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache delete mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache delete mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt delete mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache delete mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll delete mode 100644 csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb delete mode 100644 csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache delete mode 100644 csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props delete mode 100644 csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets diff --git a/bindings/cs/.gitignore b/bindings/cs/.gitignore new file mode 100644 index 0000000..6d14531 --- /dev/null +++ b/bindings/cs/.gitignore @@ -0,0 +1,3 @@ +*.dll +obj/ +bin/ \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding.sln b/bindings/cs/LibSurviveBinding.sln new file mode 100644 index 0000000..539470c --- /dev/null +++ b/bindings/cs/LibSurviveBinding.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27428.2015 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibSurviveBinding", "LibSurviveBinding\LibSurviveBinding.csproj", "{3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CA47A8D6-3379-4ABA-927E-86BBDDE1D304} + EndGlobalSection +EndGlobal diff --git a/bindings/cs/LibSurviveBinding/Binding.cs b/bindings/cs/LibSurviveBinding/Binding.cs new file mode 100644 index 0000000..f4f0652 --- /dev/null +++ b/bindings/cs/LibSurviveBinding/Binding.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LibSurviveBinding +{ + class Binding + { + /* + typedef int (* htc_config_func) (SurviveObject* so, char* ct0conf, int len); + typedef void (* text_feedback_func) (SurviveContext* ctx, const char* fault ); + typedef void (* light_process_func) (SurviveObject* so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, uint32_t lighthouse); + typedef void (* imu_process_func) (SurviveObject* so, int mask, FLT* accelgyro, uint32_t timecode, int id); + typedef void (* angle_process_func) (SurviveObject* so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh); + typedef void (* button_process_func) (SurviveObject* so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); + typedef void (* raw_pose_func) (SurviveObject* so, uint8_t lighthouse, SurvivePose* pose); + typedef void (* lighthouse_pose_func) (SurviveContext* ctx, uint8_t lighthouse, SurvivePose* lighthouse_pose, + SurvivePose* object_pose); + */ + } + + public delegate int htc_config_func(IntPtr so, char ct0conf, int len); + public delegate void text_feedback_func(IntPtr ctx, string fault); + public delegate void light_process_func(IntPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse); + public delegate void imu_process_func(IntPtr so, int mask, double accelgyro, UInt32 timecode, int id); + public delegate void angle_process_func(IntPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); + public delegate void button_process_func(IntPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); + public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); + public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, + IntPtr object_pose); + public delegate void handle_lightcap_func (IntPtr so, IntPtr le); + +} diff --git a/bindings/cs/LibSurviveBinding/Config_entry.cs b/bindings/cs/LibSurviveBinding/Config_entry.cs new file mode 100644 index 0000000..85a6701 --- /dev/null +++ b/bindings/cs/LibSurviveBinding/Config_entry.cs @@ -0,0 +1,31 @@ +namespace LibSurviveBinding +{ + + // internal class Config_entry + // { + // char[] tag; + // cval_type type; + // /** + // union { + //uint32_t i; + // FLT f; + // } + + // numeric; + // **/ + // char* data; + // uint32_t elements; + + // } + + // public enum cval_type + // { + // CONFIG_UNKNOWN = 0, + // CONFIG_FLOAT = 1, + // CONFIG_UINT32 = 2, + // CONFIG_STRING = 3, + // CONFIG_FLOAT_ARRAY = 4, + // } + + +} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj b/bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj new file mode 100644 index 0000000..646c16d --- /dev/null +++ b/bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj @@ -0,0 +1,18 @@ + + + + Exe + netcoreapp2.0 + + + + + Always + + + + + + + + diff --git a/bindings/cs/LibSurviveBinding/LightcapElement.cs b/bindings/cs/LibSurviveBinding/LightcapElement.cs new file mode 100644 index 0000000..ca51fb9 --- /dev/null +++ b/bindings/cs/LibSurviveBinding/LightcapElement.cs @@ -0,0 +1,6 @@ +namespace LibSurviveBinding +{ + public class LightcapElement + { + } +} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/Program.cs b/bindings/cs/LibSurviveBinding/Program.cs new file mode 100644 index 0000000..b6d0d8f --- /dev/null +++ b/bindings/cs/LibSurviveBinding/Program.cs @@ -0,0 +1,62 @@ +using System; +using System.Runtime.InteropServices; + +namespace LibSurVive +{ + class Program + { + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern IntPtr survive_init_internal(int argc, string[] args); + + public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); + public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose); + public delegate void light_process_func( IntPtr so, int sensor_id, int acode, int timeinsweep, + UInt32 timecode, UInt32 length, UInt32 lighthouse); + + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern void survive_install_raw_pose_fn(IntPtr ctx, raw_pose_func fbp); + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern void survive_install_lighthouse_pose_fn(IntPtr ctx, lighthouse_pose_func fbp); + + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern void survive_install_light_fn(IntPtr ctx, light_process_func fbp); + + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern int survive_startup(IntPtr ctx); + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern void survive_cal_install(IntPtr ctx); + + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + static extern int survive_poll(IntPtr ctx); + + static void Main(string[] args) + { + IntPtr context = survive_init_internal(args.Length, args); + + survive_install_lighthouse_pose_fn(context, LighthousPos); + survive_install_raw_pose_fn(context, PositionUpdate); + survive_install_light_fn(context, LightUpdate); + + survive_startup(context); + survive_cal_install(context); + + while(survive_poll(context) == 0) {} + + } + + public static void LightUpdate( IntPtr so, int sensor_id, int acode, int timeinsweep, + UInt32 timecode, UInt32 length, UInt32 lighthouse) { + Console.WriteLine(timeinsweep); + } + + public static void PositionUpdate(IntPtr so, byte lighthouse, IntPtr pose) + { + Console.WriteLine(pose); + } + + public static void LighthousPos(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose) + { + + } + } +} diff --git a/bindings/cs/LibSurviveBinding/SurviveContext.cs b/bindings/cs/LibSurviveBinding/SurviveContext.cs new file mode 100644 index 0000000..2ba9b7c --- /dev/null +++ b/bindings/cs/LibSurviveBinding/SurviveContext.cs @@ -0,0 +1,44 @@ +namespace LibSurviveBinding +{ + /* + public struct SurviveContext + { + text_feedback_func faultfunction; + text_feedback_func notefunction; + light_process_func lightproc; + imu_process_func imuproc; + angle_process_func angleproc; + button_process_func buttonproc; + raw_pose_func rawposeproc; + lighthouse_pose_func lighthouseposeproc; + htc_config_func configfunction; + handle_lightcap_func lightcapfunction; + + Config_group global_config_values; + Config_group* lh_config; //lighthouse configs + Config_group* temporary_config_values; //Set per-session, from command-line. Not saved but override global_config_values + + //Calibration data: + int activeLighthouses; + BaseStationData bsd[NUM_LIGHTHOUSES]; + SurviveCalData* calptr; //If and only if the calibration subsystem is attached. + struct SurviveRecordingData *recptr; // Iff recording is attached + SurviveObject** objs; + int objs_ct; + + void** drivers; + DeviceDriverCb* driverpolls; + DeviceDriverCb* drivercloses; + DeviceDriverMagicCb* drivermagics; + int driver_ct; + + SurviveState state; + + void* buttonservicethread; + ButtonQueue buttonQueue; + + void* user_ptr; + + } + */ +} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/SurviveObject.cs b/bindings/cs/LibSurviveBinding/SurviveObject.cs new file mode 100644 index 0000000..bb9e3cd --- /dev/null +++ b/bindings/cs/LibSurviveBinding/SurviveObject.cs @@ -0,0 +1,6 @@ +namespace LibSurviveBinding +{ + public class SurviveObject + { + } +} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/SurvivePose.cs b/bindings/cs/LibSurviveBinding/SurvivePose.cs new file mode 100644 index 0000000..9808d89 --- /dev/null +++ b/bindings/cs/LibSurviveBinding/SurvivePose.cs @@ -0,0 +1,6 @@ +namespace LibSurviveBinding +{ + public class SurvivePose + { + } +} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/config_group.cs b/bindings/cs/LibSurviveBinding/config_group.cs new file mode 100644 index 0000000..8a2f00e --- /dev/null +++ b/bindings/cs/LibSurviveBinding/config_group.cs @@ -0,0 +1,14 @@ +using System; + +namespace LibSurviveBinding +{ + /* + internal class Config_group + { + Config_entry config_entries; + UInt16 used_entries; + UInt16 max_entries; + + } + */ +} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding.sln b/csharp-binding/LibSurviveBinding.sln deleted file mode 100644 index 539470c..0000000 --- a/csharp-binding/LibSurviveBinding.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27428.2015 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibSurviveBinding", "LibSurviveBinding\LibSurviveBinding.csproj", "{3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {CA47A8D6-3379-4ABA-927E-86BBDDE1D304} - EndGlobalSection -EndGlobal diff --git a/csharp-binding/LibSurviveBinding/Binding.cs b/csharp-binding/LibSurviveBinding/Binding.cs deleted file mode 100644 index f4f0652..0000000 --- a/csharp-binding/LibSurviveBinding/Binding.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace LibSurviveBinding -{ - class Binding - { - /* - typedef int (* htc_config_func) (SurviveObject* so, char* ct0conf, int len); - typedef void (* text_feedback_func) (SurviveContext* ctx, const char* fault ); - typedef void (* light_process_func) (SurviveObject* so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, uint32_t lighthouse); - typedef void (* imu_process_func) (SurviveObject* so, int mask, FLT* accelgyro, uint32_t timecode, int id); - typedef void (* angle_process_func) (SurviveObject* so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh); - typedef void (* button_process_func) (SurviveObject* so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); - typedef void (* raw_pose_func) (SurviveObject* so, uint8_t lighthouse, SurvivePose* pose); - typedef void (* lighthouse_pose_func) (SurviveContext* ctx, uint8_t lighthouse, SurvivePose* lighthouse_pose, - SurvivePose* object_pose); - */ - } - - public delegate int htc_config_func(IntPtr so, char ct0conf, int len); - public delegate void text_feedback_func(IntPtr ctx, string fault); - public delegate void light_process_func(IntPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse); - public delegate void imu_process_func(IntPtr so, int mask, double accelgyro, UInt32 timecode, int id); - public delegate void angle_process_func(IntPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); - public delegate void button_process_func(IntPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); - public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); - public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, - IntPtr object_pose); - public delegate void handle_lightcap_func (IntPtr so, IntPtr le); - -} diff --git a/csharp-binding/LibSurviveBinding/Config_entry.cs b/csharp-binding/LibSurviveBinding/Config_entry.cs deleted file mode 100644 index 85a6701..0000000 --- a/csharp-binding/LibSurviveBinding/Config_entry.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace LibSurviveBinding -{ - - // internal class Config_entry - // { - // char[] tag; - // cval_type type; - // /** - // union { - //uint32_t i; - // FLT f; - // } - - // numeric; - // **/ - // char* data; - // uint32_t elements; - - // } - - // public enum cval_type - // { - // CONFIG_UNKNOWN = 0, - // CONFIG_FLOAT = 1, - // CONFIG_UINT32 = 2, - // CONFIG_STRING = 3, - // CONFIG_FLOAT_ARRAY = 4, - // } - - -} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj b/csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj deleted file mode 100644 index e3be07c..0000000 --- a/csharp-binding/LibSurviveBinding/LibSurviveBinding.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - netcoreapp2.0 - - - - - Always - - - - diff --git a/csharp-binding/LibSurviveBinding/LightcapElement.cs b/csharp-binding/LibSurviveBinding/LightcapElement.cs deleted file mode 100644 index ca51fb9..0000000 --- a/csharp-binding/LibSurviveBinding/LightcapElement.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace LibSurviveBinding -{ - public class LightcapElement - { - } -} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/Program.cs b/csharp-binding/LibSurviveBinding/Program.cs deleted file mode 100644 index 7ae8e76..0000000 --- a/csharp-binding/LibSurviveBinding/Program.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace LibSurVive -{ - class Program - { - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern IntPtr survive_init_internal(int argc, char[] args); - - public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); - public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose); - - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern void survive_install_raw_pose_fn(IntPtr ctx, raw_pose_func fbp); - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern void survive_install_lighthouse_pose_fn(IntPtr ctx, lighthouse_pose_func fbp); - - - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern int survive_startup(IntPtr ctx); - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern void survive_cal_install(IntPtr ctx); - - public static lighthouse_pose_func lighthouse_Pose_Func { get; private set; } - public static raw_pose_func raw_Pose_Func { get; private set; } - - static void Main(string[] args) - { - IntPtr context = survive_init_internal(0, null); - - lighthouse_Pose_Func = LighthousPos; - survive_install_lighthouse_pose_fn(context, lighthouse_Pose_Func); - raw_Pose_Func = PositionUpdate; - survive_install_raw_pose_fn(context, raw_Pose_Func); - - try - { - int a = survive_startup(context); - //survive_cal_install(context); - } - catch (Exception) - { - - throw; - } - - bool running = true; - - - - Console.WriteLine("Hello World!"); - - while (running) - { - Console.ReadLine(); - } - - } - - public static void PositionUpdate(IntPtr so, byte lighthouse, IntPtr pose) - { - //Console.WriteLine(pose); - } - - public static void LighthousPos(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose) - { - - } - } -} diff --git a/csharp-binding/LibSurviveBinding/SurviveContext.cs b/csharp-binding/LibSurviveBinding/SurviveContext.cs deleted file mode 100644 index 2ba9b7c..0000000 --- a/csharp-binding/LibSurviveBinding/SurviveContext.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace LibSurviveBinding -{ - /* - public struct SurviveContext - { - text_feedback_func faultfunction; - text_feedback_func notefunction; - light_process_func lightproc; - imu_process_func imuproc; - angle_process_func angleproc; - button_process_func buttonproc; - raw_pose_func rawposeproc; - lighthouse_pose_func lighthouseposeproc; - htc_config_func configfunction; - handle_lightcap_func lightcapfunction; - - Config_group global_config_values; - Config_group* lh_config; //lighthouse configs - Config_group* temporary_config_values; //Set per-session, from command-line. Not saved but override global_config_values - - //Calibration data: - int activeLighthouses; - BaseStationData bsd[NUM_LIGHTHOUSES]; - SurviveCalData* calptr; //If and only if the calibration subsystem is attached. - struct SurviveRecordingData *recptr; // Iff recording is attached - SurviveObject** objs; - int objs_ct; - - void** drivers; - DeviceDriverCb* driverpolls; - DeviceDriverCb* drivercloses; - DeviceDriverMagicCb* drivermagics; - int driver_ct; - - SurviveState state; - - void* buttonservicethread; - ButtonQueue buttonQueue; - - void* user_ptr; - - } - */ -} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/SurviveObject.cs b/csharp-binding/LibSurviveBinding/SurviveObject.cs deleted file mode 100644 index bb9e3cd..0000000 --- a/csharp-binding/LibSurviveBinding/SurviveObject.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace LibSurviveBinding -{ - public class SurviveObject - { - } -} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/SurvivePose.cs b/csharp-binding/LibSurviveBinding/SurvivePose.cs deleted file mode 100644 index 9808d89..0000000 --- a/csharp-binding/LibSurviveBinding/SurvivePose.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace LibSurviveBinding -{ - public class SurvivePose - { - } -} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll deleted file mode 100644 index 08f1a10..0000000 Binary files a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.dll and /dev/null differ diff --git a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb deleted file mode 100644 index c8442a1..0000000 Binary files a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/LibSurviveBinding.pdb and /dev/null differ diff --git a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll b/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll deleted file mode 100644 index 09738c8..0000000 Binary files a/csharp-binding/LibSurviveBinding/bin/Debug/netcoreapp2.0/libsurvive.dll and /dev/null differ diff --git a/csharp-binding/LibSurviveBinding/config_group.cs b/csharp-binding/LibSurviveBinding/config_group.cs deleted file mode 100644 index 8a2f00e..0000000 --- a/csharp-binding/LibSurviveBinding/config_group.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace LibSurviveBinding -{ - /* - internal class Config_group - { - Config_entry config_entries; - UInt16 used_entries; - UInt16 max_entries; - - } - */ -} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/libsurvive.dll b/csharp-binding/LibSurviveBinding/libsurvive.dll deleted file mode 100644 index 09738c8..0000000 Binary files a/csharp-binding/LibSurviveBinding/libsurvive.dll and /dev/null differ diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs deleted file mode 100644 index 0c76a75..0000000 --- a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("LibSurviveBinding")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] -[assembly: System.Reflection.AssemblyProductAttribute("LibSurviveBinding")] -[assembly: System.Reflection.AssemblyTitleAttribute("LibSurviveBinding")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache deleted file mode 100644 index 27570f7..0000000 --- a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -b297cfadb5fc15fdc85ac80d1db8dc47ecc7fa1f diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache deleted file mode 100644 index d7b7e81..0000000 --- a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -e5ec51aa179849bdaf5ff16a14a375413f2f7a0b diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt deleted file mode 100644 index a699d0e..0000000 --- a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,12 +0,0 @@ -P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.deps.json -P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.runtimeconfig.json -P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.runtimeconfig.dev.json -P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.dll -P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\LibSurviveBinding.pdb -P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.csprojResolveAssemblyReference.cache -P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.csproj.CoreCompileInputs.cache -P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.AssemblyInfoInputs.cache -P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.AssemblyInfo.cs -P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.dll -P:\csharp\LibSurviveBinding\obj\Debug\netcoreapp2.0\LibSurviveBinding.pdb -P:\csharp\LibSurviveBinding\bin\Debug\netcoreapp2.0\libsurvive.dll diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache deleted file mode 100644 index 94b7814..0000000 Binary files a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.csprojResolveAssemblyReference.cache and /dev/null differ diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll deleted file mode 100644 index 08f1a10..0000000 Binary files a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.dll and /dev/null differ diff --git a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb b/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb deleted file mode 100644 index c8442a1..0000000 Binary files a/csharp-binding/LibSurviveBinding/obj/Debug/netcoreapp2.0/LibSurviveBinding.pdb and /dev/null differ diff --git a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache deleted file mode 100644 index 55c49f2..0000000 --- a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.cache +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": 1, - "dgSpecHash": "WfCkKm3U/vtoEsgbYzrhLfrfUejWLQZtOI4PCmuZ/c/RM+JDSQotxYTHxQQ6Blgu3cg1aVoZ15gcgmVkgjRwSg==", - "success": true -} \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props deleted file mode 100644 index f4fbbaa..0000000 --- a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.props +++ /dev/null @@ -1,18 +0,0 @@ - - - - True - NuGet - P:\csharp\LibSurviveBinding\obj\project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\Peter\.nuget\packages\;C:\Program Files\dotnet\sdk\NuGetFallbackFolder - PackageReference - 4.6.1 - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - \ No newline at end of file diff --git a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets b/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets deleted file mode 100644 index 91fd1c9..0000000 --- a/csharp-binding/LibSurviveBinding/obj/LibSurviveBinding.csproj.nuget.g.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - - \ No newline at end of file -- cgit v1.2.3 From ae18f10ff58d3a8795dd85fb187e225d07751bf2 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 16:37:07 -0600 Subject: Added entries to gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 712fde2..ca87dd5 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,6 @@ calibrate test .idea *.json -*.csv \ No newline at end of file +*.csv +data_recorder +simple_pose_test \ No newline at end of file -- cgit v1.2.3 From bb37e04c7ec35f28ec929afb9634fea1db007723 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 17:09:44 -0600 Subject: window update for os_generic being header only --- winbuild/libsurvive/libsurvive.def | 4 ---- winbuild/libsurvive/libsurvive.vcxproj | 3 +-- winbuild/libsurvive/libsurvive.vcxproj.filters | 3 --- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/winbuild/libsurvive/libsurvive.def b/winbuild/libsurvive/libsurvive.def index 86eb377..fb2f05e 100644 --- a/winbuild/libsurvive/libsurvive.def +++ b/winbuild/libsurvive/libsurvive.def @@ -26,7 +26,3 @@ EXPORTS survive_default_lighthouse_pose_process quatnormalize quatrotatevector - - OGUSleep - OGGetAbsoluteTime - OGCreateThread diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index 45a684b..acf8500 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -77,7 +77,7 @@ Level3 Disabled - USE_DOUBLE;RUNTIME_SYMNUM;RUNTIME_SYMNUMX;NOZLIB;_CRT_SECURE_NO_WARNINGS;HIDAPI;WINDOWS;_DEBUG;_LIB;%(PreprocessorDefinitions) + FLT=double;USE_DOUBLE;RUNTIME_SYMNUM;RUNTIME_SYMNUMX;NOZLIB;_CRT_SECURE_NO_WARNINGS;HIDAPI;WINDOWS;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\winbuild;..\..\include\libsurvive;..\..\redist;%(AdditionalIncludeDirectories) @@ -149,7 +149,6 @@ - diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index ab26bd0..717038c 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -51,9 +51,6 @@ Source Files - - Source Files - Source Files -- cgit v1.2.3 From 91f0cab811e983da63ea49f6e24afae283138a1c Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 20:36:05 -0600 Subject: Functional C# in windows --- bindings/cs/Demo/App.config | 6 ++ bindings/cs/Demo/Demo.csproj | 86 +++++++++++++++++++++ bindings/cs/Demo/Program.cs | 32 ++++++++ bindings/cs/Demo/Properties/AssemblyInfo.cs | 36 +++++++++ bindings/cs/LibSurviveBinding.sln | 54 +++++++++++-- bindings/cs/LibSurviveBinding/Binding.cs | 33 -------- bindings/cs/LibSurviveBinding/Config_entry.cs | 31 -------- .../cs/LibSurviveBinding/LibSurviveBinding.csproj | 18 ----- bindings/cs/LibSurviveBinding/LightcapElement.cs | 6 -- bindings/cs/LibSurviveBinding/Program.cs | 62 --------------- bindings/cs/LibSurviveBinding/SurviveContext.cs | 44 ----------- bindings/cs/LibSurviveBinding/SurviveObject.cs | 6 -- bindings/cs/LibSurviveBinding/SurvivePose.cs | 6 -- bindings/cs/LibSurviveBinding/config_group.cs | 14 ---- bindings/cs/libsurvive.net/SurviveContext.cs | 90 ++++++++++++++++++++++ bindings/cs/libsurvive.net/cfunctions.cs | 84 ++++++++++++++++++++ bindings/cs/libsurvive.net/libsurvive.net.csproj | 7 ++ calibrate.c | 2 - include/libsurvive/survive.h | 63 ++++++++------- redist/symbol_enumerator.c | 5 +- src/survive.c | 5 ++ src/survive_playback.c | 2 +- winbuild/libsurvive/libsurvive.def | 2 + winbuild/libsurvive/libsurvive.vcxproj | 5 +- winbuild/libsurvive/libsurvive.vcxproj.filters | 3 + 25 files changed, 441 insertions(+), 261 deletions(-) create mode 100644 bindings/cs/Demo/App.config create mode 100644 bindings/cs/Demo/Demo.csproj create mode 100644 bindings/cs/Demo/Program.cs create mode 100644 bindings/cs/Demo/Properties/AssemblyInfo.cs delete mode 100644 bindings/cs/LibSurviveBinding/Binding.cs delete mode 100644 bindings/cs/LibSurviveBinding/Config_entry.cs delete mode 100644 bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj delete mode 100644 bindings/cs/LibSurviveBinding/LightcapElement.cs delete mode 100644 bindings/cs/LibSurviveBinding/Program.cs delete mode 100644 bindings/cs/LibSurviveBinding/SurviveContext.cs delete mode 100644 bindings/cs/LibSurviveBinding/SurviveObject.cs delete mode 100644 bindings/cs/LibSurviveBinding/SurvivePose.cs delete mode 100644 bindings/cs/LibSurviveBinding/config_group.cs create mode 100644 bindings/cs/libsurvive.net/SurviveContext.cs create mode 100644 bindings/cs/libsurvive.net/cfunctions.cs create mode 100644 bindings/cs/libsurvive.net/libsurvive.net.csproj diff --git a/bindings/cs/Demo/App.config b/bindings/cs/Demo/App.config new file mode 100644 index 0000000..731f6de --- /dev/null +++ b/bindings/cs/Demo/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/bindings/cs/Demo/Demo.csproj b/bindings/cs/Demo/Demo.csproj new file mode 100644 index 0000000..f347a5e --- /dev/null +++ b/bindings/cs/Demo/Demo.csproj @@ -0,0 +1,86 @@ + + + + + Debug + AnyCPU + {D3A43A2F-03B7-4A10-928F-686790036838} + Exe + Demo + Demo + v4.6.1 + 512 + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + false + ..\x64\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + {da1b12d7-a121-4d40-b363-4893e4f88b8a} + libsurvive.net + + + + + False + Microsoft .NET Framework 4.6.1 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/bindings/cs/Demo/Program.cs b/bindings/cs/Demo/Program.cs new file mode 100644 index 0000000..1644360 --- /dev/null +++ b/bindings/cs/Demo/Program.cs @@ -0,0 +1,32 @@ +using libsurvive; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Demo +{ + internal class MyHandler : SurviveContext + { + public MyHandler() + { + } + + public MyHandler(string[] args) : base(args) + { + } + } + class Program + { + static void Main(string[] args) + { + MyHandler handler = new MyHandler(args); + + while (handler.Poll() == 0) { + } + + } + + } +} diff --git a/bindings/cs/Demo/Properties/AssemblyInfo.cs b/bindings/cs/Demo/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2c6a6c7 --- /dev/null +++ b/bindings/cs/Demo/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Demo")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Demo")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d3a43a2f-03b7-4a10-928f-686790036838")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/bindings/cs/LibSurviveBinding.sln b/bindings/cs/LibSurviveBinding.sln index 539470c..b2e2f11 100644 --- a/bindings/cs/LibSurviveBinding.sln +++ b/bindings/cs/LibSurviveBinding.sln @@ -1,20 +1,62 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27428.2015 +VisualStudioVersion = 15.0.27130.2003 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibSurviveBinding", "LibSurviveBinding\LibSurviveBinding.csproj", "{3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demo", "Demo\Demo.csproj", "{D3A43A2F-03B7-4A10-928F-686790036838}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "libsurvive.net", "libsurvive.net\libsurvive.net.csproj", "{DA1B12D7-A121-4D40-B363-4893E4F88B8A}" + ProjectSection(ProjectDependencies) = postProject + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F} = {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsurvive", "..\..\winbuild\libsurvive\libsurvive.vcxproj", "{435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DEFC8F7-C61E-4BC2-B743-E39453C6BA10}.Release|Any CPU.Build.0 = Release|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Debug|x64.ActiveCfg = Debug|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Debug|x64.Build.0 = Debug|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Debug|x86.ActiveCfg = Debug|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Debug|x86.Build.0 = Debug|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Release|Any CPU.Build.0 = Release|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Release|x64.ActiveCfg = Release|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Release|x64.Build.0 = Release|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Release|x86.ActiveCfg = Release|Any CPU + {D3A43A2F-03B7-4A10-928F-686790036838}.Release|x86.Build.0 = Release|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Debug|x64.ActiveCfg = Debug|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Debug|x64.Build.0 = Debug|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Debug|x86.ActiveCfg = Debug|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Debug|x86.Build.0 = Debug|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Release|Any CPU.Build.0 = Release|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Release|x64.ActiveCfg = Release|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Release|x64.Build.0 = Release|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Release|x86.ActiveCfg = Release|Any CPU + {DA1B12D7-A121-4D40-B363-4893E4F88B8A}.Release|x86.Build.0 = Release|Any CPU + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Debug|Any CPU.ActiveCfg = Debug|x64 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Debug|Any CPU.Build.0 = Debug|x64 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Debug|x64.ActiveCfg = Debug|x64 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Debug|x64.Build.0 = Debug|x64 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Debug|x86.ActiveCfg = Debug|Win32 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Debug|x86.Build.0 = Debug|Win32 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Release|Any CPU.ActiveCfg = Release|Win32 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Release|x64.ActiveCfg = Release|x64 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Release|x64.Build.0 = Release|x64 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Release|x86.ActiveCfg = Release|Win32 + {435CFD2C-8724-42EE-8FDE-71EF7D2C6B2F}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/bindings/cs/LibSurviveBinding/Binding.cs b/bindings/cs/LibSurviveBinding/Binding.cs deleted file mode 100644 index f4f0652..0000000 --- a/bindings/cs/LibSurviveBinding/Binding.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace LibSurviveBinding -{ - class Binding - { - /* - typedef int (* htc_config_func) (SurviveObject* so, char* ct0conf, int len); - typedef void (* text_feedback_func) (SurviveContext* ctx, const char* fault ); - typedef void (* light_process_func) (SurviveObject* so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, uint32_t lighthouse); - typedef void (* imu_process_func) (SurviveObject* so, int mask, FLT* accelgyro, uint32_t timecode, int id); - typedef void (* angle_process_func) (SurviveObject* so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh); - typedef void (* button_process_func) (SurviveObject* so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); - typedef void (* raw_pose_func) (SurviveObject* so, uint8_t lighthouse, SurvivePose* pose); - typedef void (* lighthouse_pose_func) (SurviveContext* ctx, uint8_t lighthouse, SurvivePose* lighthouse_pose, - SurvivePose* object_pose); - */ - } - - public delegate int htc_config_func(IntPtr so, char ct0conf, int len); - public delegate void text_feedback_func(IntPtr ctx, string fault); - public delegate void light_process_func(IntPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse); - public delegate void imu_process_func(IntPtr so, int mask, double accelgyro, UInt32 timecode, int id); - public delegate void angle_process_func(IntPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); - public delegate void button_process_func(IntPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); - public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); - public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, - IntPtr object_pose); - public delegate void handle_lightcap_func (IntPtr so, IntPtr le); - -} diff --git a/bindings/cs/LibSurviveBinding/Config_entry.cs b/bindings/cs/LibSurviveBinding/Config_entry.cs deleted file mode 100644 index 85a6701..0000000 --- a/bindings/cs/LibSurviveBinding/Config_entry.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace LibSurviveBinding -{ - - // internal class Config_entry - // { - // char[] tag; - // cval_type type; - // /** - // union { - //uint32_t i; - // FLT f; - // } - - // numeric; - // **/ - // char* data; - // uint32_t elements; - - // } - - // public enum cval_type - // { - // CONFIG_UNKNOWN = 0, - // CONFIG_FLOAT = 1, - // CONFIG_UINT32 = 2, - // CONFIG_STRING = 3, - // CONFIG_FLOAT_ARRAY = 4, - // } - - -} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj b/bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj deleted file mode 100644 index 646c16d..0000000 --- a/bindings/cs/LibSurviveBinding/LibSurviveBinding.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - Exe - netcoreapp2.0 - - - - - Always - - - - - - - - diff --git a/bindings/cs/LibSurviveBinding/LightcapElement.cs b/bindings/cs/LibSurviveBinding/LightcapElement.cs deleted file mode 100644 index ca51fb9..0000000 --- a/bindings/cs/LibSurviveBinding/LightcapElement.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace LibSurviveBinding -{ - public class LightcapElement - { - } -} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/Program.cs b/bindings/cs/LibSurviveBinding/Program.cs deleted file mode 100644 index b6d0d8f..0000000 --- a/bindings/cs/LibSurviveBinding/Program.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace LibSurVive -{ - class Program - { - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern IntPtr survive_init_internal(int argc, string[] args); - - public delegate void raw_pose_func(IntPtr so, byte lighthouse, IntPtr pose); - public delegate void lighthouse_pose_func(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose); - public delegate void light_process_func( IntPtr so, int sensor_id, int acode, int timeinsweep, - UInt32 timecode, UInt32 length, UInt32 lighthouse); - - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern void survive_install_raw_pose_fn(IntPtr ctx, raw_pose_func fbp); - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern void survive_install_lighthouse_pose_fn(IntPtr ctx, lighthouse_pose_func fbp); - - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern void survive_install_light_fn(IntPtr ctx, light_process_func fbp); - - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern int survive_startup(IntPtr ctx); - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern void survive_cal_install(IntPtr ctx); - - [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] - static extern int survive_poll(IntPtr ctx); - - static void Main(string[] args) - { - IntPtr context = survive_init_internal(args.Length, args); - - survive_install_lighthouse_pose_fn(context, LighthousPos); - survive_install_raw_pose_fn(context, PositionUpdate); - survive_install_light_fn(context, LightUpdate); - - survive_startup(context); - survive_cal_install(context); - - while(survive_poll(context) == 0) {} - - } - - public static void LightUpdate( IntPtr so, int sensor_id, int acode, int timeinsweep, - UInt32 timecode, UInt32 length, UInt32 lighthouse) { - Console.WriteLine(timeinsweep); - } - - public static void PositionUpdate(IntPtr so, byte lighthouse, IntPtr pose) - { - Console.WriteLine(pose); - } - - public static void LighthousPos(IntPtr ctx, byte lighthouse, IntPtr lighthouse_pose, IntPtr object_pose) - { - - } - } -} diff --git a/bindings/cs/LibSurviveBinding/SurviveContext.cs b/bindings/cs/LibSurviveBinding/SurviveContext.cs deleted file mode 100644 index 2ba9b7c..0000000 --- a/bindings/cs/LibSurviveBinding/SurviveContext.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace LibSurviveBinding -{ - /* - public struct SurviveContext - { - text_feedback_func faultfunction; - text_feedback_func notefunction; - light_process_func lightproc; - imu_process_func imuproc; - angle_process_func angleproc; - button_process_func buttonproc; - raw_pose_func rawposeproc; - lighthouse_pose_func lighthouseposeproc; - htc_config_func configfunction; - handle_lightcap_func lightcapfunction; - - Config_group global_config_values; - Config_group* lh_config; //lighthouse configs - Config_group* temporary_config_values; //Set per-session, from command-line. Not saved but override global_config_values - - //Calibration data: - int activeLighthouses; - BaseStationData bsd[NUM_LIGHTHOUSES]; - SurviveCalData* calptr; //If and only if the calibration subsystem is attached. - struct SurviveRecordingData *recptr; // Iff recording is attached - SurviveObject** objs; - int objs_ct; - - void** drivers; - DeviceDriverCb* driverpolls; - DeviceDriverCb* drivercloses; - DeviceDriverMagicCb* drivermagics; - int driver_ct; - - SurviveState state; - - void* buttonservicethread; - ButtonQueue buttonQueue; - - void* user_ptr; - - } - */ -} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/SurviveObject.cs b/bindings/cs/LibSurviveBinding/SurviveObject.cs deleted file mode 100644 index bb9e3cd..0000000 --- a/bindings/cs/LibSurviveBinding/SurviveObject.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace LibSurviveBinding -{ - public class SurviveObject - { - } -} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/SurvivePose.cs b/bindings/cs/LibSurviveBinding/SurvivePose.cs deleted file mode 100644 index 9808d89..0000000 --- a/bindings/cs/LibSurviveBinding/SurvivePose.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace LibSurviveBinding -{ - public class SurvivePose - { - } -} \ No newline at end of file diff --git a/bindings/cs/LibSurviveBinding/config_group.cs b/bindings/cs/LibSurviveBinding/config_group.cs deleted file mode 100644 index 8a2f00e..0000000 --- a/bindings/cs/LibSurviveBinding/config_group.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace LibSurviveBinding -{ - /* - internal class Config_group - { - Config_entry config_entries; - UInt16 used_entries; - UInt16 max_entries; - - } - */ -} \ No newline at end of file diff --git a/bindings/cs/libsurvive.net/SurviveContext.cs b/bindings/cs/libsurvive.net/SurviveContext.cs new file mode 100644 index 0000000..1fb8c11 --- /dev/null +++ b/bindings/cs/libsurvive.net/SurviveContext.cs @@ -0,0 +1,90 @@ +using System; + +namespace libsurvive +{ + using SurviveContextPtr = IntPtr; + using SurviveObjectPtr = IntPtr; + using SurvivePosePtr = IntPtr; + + public class SurviveContext : IDisposable + { + protected IntPtr ctx; + + public void Dispose() + { + cfunctions.survive_close(ctx); + ctx = IntPtr.Zero; + } + + public SurviveContext() : this(null) { } + + public SurviveContext(string[] args) + { + string[] newArgs = new string[args.Length + 1]; + newArgs[0] = System.Reflection.Assembly.GetEntryAssembly().FullName; + Array.Copy(args, 0, newArgs, 1, args.Length); + + ctx = cfunctions.survive_init_internal(newArgs.Length, newArgs); + + cfunctions.survive_install_raw_pose_fn(ctx, PoseEvent); + cfunctions.survive_install_light_fn(ctx, LightEvent); + cfunctions.survive_install_lighthouse_pose_fn(ctx, LightHouseEvent); + cfunctions.survive_install_angle_fn(ctx, AngleEvent); + cfunctions.survive_install_button_fn(ctx, ButtonEvent); + cfunctions.survive_install_htc_config_fn(ctx, HTCConfigEvent); + cfunctions.survive_install_imu_fn(ctx, IMUEvent); + cfunctions.survive_install_error_fn(ctx, ErrorEvent); + cfunctions.survive_install_info_fn(ctx, InfoEvent); + } + + protected void InfoEvent(SurviveObjectPtr ctx, string fault) + { + Console.Out.WriteLine(fault); + } + + protected void ErrorEvent(SurviveObjectPtr ctx, string fault) + { + Console.Error.WriteLine(fault); + } + + protected void IMUEvent(SurviveObjectPtr so, int mask, double[] accelgyro, uint timecode, int id) + { + cfunctions.survive_default_imu_process(so, mask, accelgyro, timecode, id); + } + + protected int HTCConfigEvent(SurviveObjectPtr so, string ct0conf, int len) + { + return cfunctions.survive_default_htc_config_process(so, ct0conf, len); + } + + protected void ButtonEvent(SurviveObjectPtr so, byte eventType, byte buttonId, byte axis1Id, ushort axis1Val, byte axis2Id, ushort axis2Val) + { + cfunctions.survive_default_button_process(so, eventType, buttonId, axis1Id, axis1Val, axis2Id, axis2Val); + } + + protected void AngleEvent(SurviveObjectPtr so, int sensor_id, int acode, uint timecode, double length, double angle, uint lh) + { + cfunctions.survive_default_angle_process(so, sensor_id, acode, timecode, length, angle, lh); + } + + protected void LightHouseEvent(SurviveObjectPtr ctx, byte lighthouse, ref SurvivePose lighthouse_pose, ref SurvivePose object_pose) + { + cfunctions.survive_default_lighthouse_pose_process(ctx, lighthouse, ref lighthouse_pose, ref object_pose); + } + + protected void LightEvent(SurviveObjectPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse) + { + cfunctions.survive_default_light_process(so, sensor_id, acode, timeinsweep, timecode, length, lighthouse); + } + + protected void PoseEvent(IntPtr so, byte lighthouse, ref SurvivePose pose) + { + cfunctions.survive_default_raw_pose_process(so, lighthouse, ref pose); + } + + public int Poll() + { + return cfunctions.survive_poll(ctx); + } + } +} \ No newline at end of file diff --git a/bindings/cs/libsurvive.net/cfunctions.cs b/bindings/cs/libsurvive.net/cfunctions.cs new file mode 100644 index 0000000..f9d88f0 --- /dev/null +++ b/bindings/cs/libsurvive.net/cfunctions.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace libsurvive +{ + using SurviveContextPtr = IntPtr; + using SurviveObjectPtr = IntPtr; + using SurvivePosePtr = IntPtr; + + [StructLayout(LayoutKind.Sequential)] + public struct SurvivePose + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public double[] Pos; // Position in the form xyz + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public double[] Rot; // Quaternion in the form wxyz + } + + class cfunctions + { + +#pragma warning disable IDE1006 // Naming Styles + [DllImport("libsurvive")] + public static extern SurviveContextPtr survive_init_internal(int argc, string[] args); + [DllImport("libsurvive")] + public static extern SurviveContextPtr survive_close(SurviveContextPtr ctx); + [DllImport("libsurvive")] + public static extern int survive_poll(SurviveContextPtr ctx); + [DllImport("libsurvive")] + public static extern int survive_startup(SurviveContextPtr ctx); + + [DllImport("libsurvive")] + public static extern void survive_install_htc_config_fn(SurviveContextPtr ctx, htc_config_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_info_fn(SurviveContextPtr ctx, text_feedback_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_error_fn(SurviveContextPtr ctx, text_feedback_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_imu_fn(SurviveContextPtr ctx, imu_process_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_angle_fn(SurviveContextPtr ctx, angle_process_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_button_fn(SurviveContextPtr ctx, button_process_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_raw_pose_fn(SurviveContextPtr ctx, raw_pose_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_lighthouse_pose_fn(SurviveContextPtr ctx, lighthouse_pose_func fbp); + [DllImport("libsurvive")] + public static extern void survive_install_light_fn(SurviveContextPtr ctx, light_process_func fbp); + [DllImport("libsurvive")] + public static extern void survive_cal_install(SurviveContextPtr ctx); + + [DllImport("libsurvive")] + public static extern void survive_default_light_process(SurviveObjectPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lh); + [DllImport("libsurvive")] + public static extern void survive_default_imu_process(SurviveObjectPtr so, int mode, double[] accelgyro, UInt32 timecode, int id); + [DllImport("libsurvive")] + public static extern void survive_default_angle_process(SurviveObjectPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); + [DllImport("libsurvive")] + public static extern void survive_default_button_process(SurviveObjectPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); + [DllImport("libsurvive")] + public static extern void survive_default_raw_pose_process(SurviveObjectPtr so, byte lighthouse, ref SurvivePose pose); + [DllImport("libsurvive")] + public static extern void survive_default_lighthouse_pose_process(SurviveContextPtr ctx, byte lighthouse, ref SurvivePose lh_pose, + ref SurvivePose obj_pose); + [DllImport("libsurvive")] + public static extern int survive_default_htc_config_process(SurviveObjectPtr so, string ct0conf, int len); + +#pragma warning restore IDE1006 // Naming Styles + } + + public delegate int htc_config_func(SurviveObjectPtr so, string ct0conf, int len); + public delegate void text_feedback_func(SurviveContextPtr ctx, string fault); + public delegate void light_process_func(SurviveObjectPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse); + public delegate void imu_process_func(SurviveObjectPtr so, int mask, double[] accelgyro, UInt32 timecode, int id); + public delegate void angle_process_func(SurviveObjectPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); + public delegate void button_process_func(SurviveObjectPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); + public delegate void raw_pose_func(SurviveObjectPtr so, byte lighthouse, ref SurvivePose pose); + public delegate void lighthouse_pose_func(SurviveContextPtr ctx, byte lighthouse, ref SurvivePose lighthouse_pose, + ref SurvivePose object_pose); + +} diff --git a/bindings/cs/libsurvive.net/libsurvive.net.csproj b/bindings/cs/libsurvive.net/libsurvive.net.csproj new file mode 100644 index 0000000..eac3503 --- /dev/null +++ b/bindings/cs/libsurvive.net/libsurvive.net.csproj @@ -0,0 +1,7 @@ + + + + netstandard1.6 + + + diff --git a/calibrate.c b/calibrate.c index 569c5cb..e21c310 100644 --- a/calibrate.c +++ b/calibrate.c @@ -404,8 +404,6 @@ void * SurviveThread(void *jnk) survive_install_angle_fn( ctx, my_angle_process ); survive_startup( ctx ); - - survive_cal_install( ctx ); if( !ctx ) diff --git a/include/libsurvive/survive.h b/include/libsurvive/survive.h index 8a1474b..85078f7 100644 --- a/include/libsurvive/survive.h +++ b/include/libsurvive/survive.h @@ -10,6 +10,13 @@ extern "C" { #endif + +#ifdef _WIN32 +#define SURVIVE_EXPORT __declspec(dllexport) +#else +#define SURVIVE_EXPORT +#endif + /** * This struct encodes what the last effective angles seen on a sensor were, and when they occured. */ @@ -203,7 +210,7 @@ struct SurviveContext void survive_verify_FLT_size(uint32_t user_size); // Baked in size of FLT to verify users of the library have the correct setting. -SurviveContext * survive_init_internal( int argc, char * const * argv ); +SURVIVE_EXPORT SurviveContext * survive_init_internal( int argc, char * const * argv ); /** * Call survive_init to get a populated SurviveContext pointer. @@ -224,20 +231,20 @@ static inline SurviveContext * survive_init( int argc, char * const * argv ) //For any of these, you may pass in 0 for the function pointer to use default behavior. //In general unless you are doing wacky things like recording or playing back data, you won't need to use this. -void survive_install_htc_config_fn( SurviveContext *ctx, htc_config_func fbp ); -void survive_install_info_fn( SurviveContext * ctx, text_feedback_func fbp ); -void survive_install_error_fn( SurviveContext * ctx, text_feedback_func fbp ); -void survive_install_light_fn( SurviveContext * ctx, light_process_func fbp ); -void survive_install_imu_fn( SurviveContext * ctx, imu_process_func fbp ); -void survive_install_angle_fn( SurviveContext * ctx, angle_process_func fbp ); -void survive_install_button_fn(SurviveContext * ctx, button_process_func fbp); -void survive_install_raw_pose_fn(SurviveContext * ctx, raw_pose_func fbp); -void survive_install_lighthouse_pose_fn(SurviveContext *ctx, lighthouse_pose_func fbp); -int survive_startup( SurviveContext * ctx ); -int survive_poll( SurviveContext * ctx ); -void survive_close( SurviveContext * ctx ); - -SurviveObject * survive_get_so_by_name( SurviveContext * ctx, const char * name ); +SURVIVE_EXPORT void survive_install_htc_config_fn( SurviveContext *ctx, htc_config_func fbp ); +SURVIVE_EXPORT void survive_install_info_fn( SurviveContext * ctx, text_feedback_func fbp ); +SURVIVE_EXPORT void survive_install_error_fn( SurviveContext * ctx, text_feedback_func fbp ); +SURVIVE_EXPORT void survive_install_light_fn( SurviveContext * ctx, light_process_func fbp ); +SURVIVE_EXPORT void survive_install_imu_fn( SurviveContext * ctx, imu_process_func fbp ); +SURVIVE_EXPORT void survive_install_angle_fn( SurviveContext * ctx, angle_process_func fbp ); +SURVIVE_EXPORT void survive_install_button_fn(SurviveContext * ctx, button_process_func fbp); +SURVIVE_EXPORT void survive_install_raw_pose_fn(SurviveContext * ctx, raw_pose_func fbp); +SURVIVE_EXPORT void survive_install_lighthouse_pose_fn(SurviveContext *ctx, lighthouse_pose_func fbp); +SURVIVE_EXPORT int survive_startup( SurviveContext * ctx ); +SURVIVE_EXPORT int survive_poll( SurviveContext * ctx ); +SURVIVE_EXPORT void survive_close( SurviveContext * ctx ); + +SURVIVE_EXPORT SurviveObject * survive_get_so_by_name( SurviveContext * ctx, const char * name ); //Utilitiy functions. int survive_simple_inflate( SurviveContext * ctx, const char * input, int inlen, char * output, int outlen ); @@ -249,30 +256,30 @@ int survive_send_magic( SurviveContext * ctx, int magic_code, void * data, int d #define SC_OVERRIDE 2 //Set, to new default value. #define SC_SETCONFIG 4 //Set, both in-memory and config file. Use in conjunction with SC_OVERRIDE. -FLT survive_configf( SurviveContext * ctx, const char *tag, char flags, FLT def ); -uint32_t survive_configi( SurviveContext * ctx, const char *tag, char flags, uint32_t def ); -const char * survive_configs( SurviveContext * ctx, const char *tag, char flags, const char *def ); +SURVIVE_EXPORT FLT survive_configf( SurviveContext * ctx, const char *tag, char flags, FLT def ); +SURVIVE_EXPORT uint32_t survive_configi( SurviveContext * ctx, const char *tag, char flags, uint32_t def ); +SURVIVE_EXPORT const char * survive_configs( SurviveContext * ctx, const char *tag, char flags, const char *def ); //Install the calibrator. -void survive_cal_install( SurviveContext * ctx ); //XXX This will be removed if not already done so. +SURVIVE_EXPORT void survive_cal_install( SurviveContext * ctx ); //XXX This will be removed if not already done so. // Read back a human-readable string description of the calibration status -int survive_cal_get_status( SurviveContext * ctx, char * description, int description_length ); +SURVIVE_EXPORT int survive_cal_get_status( SurviveContext * ctx, char * description, int description_length ); // Induce haptic feedback -int survive_haptic(SurviveObject * so, uint8_t reserved, uint16_t pulseHigh, uint16_t pulseLow, uint16_t repeatCount); +SURVIVE_EXPORT int survive_haptic(SurviveObject * so, uint8_t reserved, uint16_t pulseHigh, uint16_t pulseLow, uint16_t repeatCount); //Call these from your callback if overridden. //Accept higher-level data. -void survive_default_light_process( SurviveObject * so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length , uint32_t lh); -void survive_default_imu_process( SurviveObject * so, int mode, FLT * accelgyro, uint32_t timecode, int id ); -void survive_default_angle_process( SurviveObject * so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh ); -void survive_default_button_process(SurviveObject * so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); -void survive_default_raw_pose_process(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose); -void survive_default_lighthouse_pose_process(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *lh_pose, +SURVIVE_EXPORT void survive_default_light_process( SurviveObject * so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length , uint32_t lh); +SURVIVE_EXPORT void survive_default_imu_process( SurviveObject * so, int mode, FLT * accelgyro, uint32_t timecode, int id ); +SURVIVE_EXPORT void survive_default_angle_process( SurviveObject * so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh ); +SURVIVE_EXPORT void survive_default_button_process(SurviveObject * so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); +SURVIVE_EXPORT void survive_default_raw_pose_process(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose); +SURVIVE_EXPORT void survive_default_lighthouse_pose_process(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *lh_pose, SurvivePose *obj_pose); -int survive_default_htc_config_process(SurviveObject *so, char *ct0conf, int len); +SURVIVE_EXPORT int survive_default_htc_config_process(SurviveObject *so, char *ct0conf, int len); diff --git a/redist/symbol_enumerator.c b/redist/symbol_enumerator.c index fcb3727..58bbfaa 100644 --- a/redist/symbol_enumerator.c +++ b/redist/symbol_enumerator.c @@ -60,7 +60,7 @@ BOOL WINAPI SymCleanup( HANDLE hProcess ); -BOOL CALLBACK __cdecl mycb( +BOOL mycb( PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext @@ -71,10 +71,11 @@ BOOL CALLBACK __cdecl mycb( int EnumerateSymbols( SymEnumeratorCallback cb ) { - HANDLE proc = GetCurrentProcess(); + HANDLE proc = GetCurrentProcess(); if( !SymInitialize( proc, 0, 1 ) ) return -1; if( !SymEnumSymbols( proc, 0, "*!*", &mycb, (void*)cb ) ) { + fprintf(stderr, "SymEnumSymbols returned %d\n", GetLastError()); SymCleanup(proc); return -2; } diff --git a/src/survive.c b/src/survive.c index 899d206..f46f128 100644 --- a/src/survive.c +++ b/src/survive.c @@ -111,6 +111,11 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { MANUAL_DRIVER_REGISTRATION(PoserDaveOrtho) MANUAL_DRIVER_REGISTRATION(PoserDummy) MANUAL_DRIVER_REGISTRATION(DriverRegHTCVive) + MANUAL_DRIVER_REGISTRATION(DriverRegPlayback) + + MANUAL_DRIVER_REGISTRATION(DisambiguatorCharles) + MANUAL_DRIVER_REGISTRATION(DisambiguatorStateBased) + MANUAL_DRIVER_REGISTRATION(DisambiguatorTurvey) #endif SurviveContext *ctx = calloc(1, sizeof(SurviveContext)); diff --git a/src/survive_playback.c b/src/survive_playback.c index 43a3c0b..c73dd2f 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -275,7 +275,7 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { if (f && !feof(f) && !ferror(f)) { driver->lineno++; - char *line; + char *line = 0; if (driver->next_time_us == 0) { size_t n = 0; diff --git a/winbuild/libsurvive/libsurvive.def b/winbuild/libsurvive/libsurvive.def index fb2f05e..3a50ce6 100644 --- a/winbuild/libsurvive/libsurvive.def +++ b/winbuild/libsurvive/libsurvive.def @@ -10,6 +10,7 @@ EXPORTS survive_install_light_fn survive_install_imu_fn survive_install_angle_fn + survive_install_htc_config_fn survive_send_magic survive_cal_install survive_cal_get_status @@ -26,3 +27,4 @@ EXPORTS survive_default_lighthouse_pose_process quatnormalize quatrotatevector + \ No newline at end of file diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index acf8500..6268d63 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -27,7 +27,7 @@ - StaticLibrary + DynamicLibrary true v141 MultiByte @@ -77,7 +77,7 @@ Level3 Disabled - FLT=double;USE_DOUBLE;RUNTIME_SYMNUM;RUNTIME_SYMNUMX;NOZLIB;_CRT_SECURE_NO_WARNINGS;HIDAPI;WINDOWS;_DEBUG;_LIB;%(PreprocessorDefinitions) + FLT=double;USE_DOUBLE;MANUAL_REGISTRATION;NOZLIB;_CRT_SECURE_NO_WARNINGS;HIDAPI;WINDOWS;_DEBUG;_LIB;%(PreprocessorDefinitions) ..\..\winbuild;..\..\include\libsurvive;..\..\redist;%(AdditionalIncludeDirectories) @@ -169,6 +169,7 @@ + diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index 717038c..5387108 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -105,6 +105,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From 08cc0afc797d2225cf23fbc785e6a28cc8667285 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Wed, 28 Mar 2018 21:52:00 -0600 Subject: Nuget packaged up dependencies --- redist/minimal_opencv.c | 172 ++++++++++++++++++++++++- src/epnp/epnp.c | 2 +- src/poser_sba.c | 1 + src/survive.c | 5 +- src/survive_cal.c | 2 +- winbuild/calibrate/calibrate.vcxproj | 11 ++ winbuild/calibrate/calibrate.vcxproj.filters | 3 + winbuild/data_recorder/data_recorder.vcxproj | 1 + winbuild/libsurvive/libsurvive.vcxproj | 33 ++++- winbuild/libsurvive/libsurvive.vcxproj.filters | 37 ++++++ winbuild/libsurvive/packages.config | 5 + winbuild/test/test.vcxproj | 4 +- 12 files changed, 265 insertions(+), 11 deletions(-) create mode 100644 winbuild/libsurvive/packages.config diff --git a/redist/minimal_opencv.c b/redist/minimal_opencv.c index 50eb7df..e35e31d 100644 --- a/redist/minimal_opencv.c +++ b/redist/minimal_opencv.c @@ -1,5 +1,3 @@ -//#include "/home/justin/source/CLAPACK/INCLUDE/f2c.h" -//#include "/home/justin/source/CLAPACK/INCLUDE/clapack.h" #include #include @@ -10,8 +8,176 @@ #include "string.h" #include +#include + //#define DEBUG_PRINT +#ifdef _WIN3211 +#include "cblas.h" + +int CBLAS_CallFromC; +int RowMajorStrg; +void cblas_xerbla(int info, const char *rout, const char *form, ...) +{ + extern int RowMajorStrg; + char empty[1] = ""; + va_list argptr; + + va_start(argptr, form); + + if (RowMajorStrg) + { + if (strstr(rout, "gemm") != 0) + { + if (info == 5) info = 4; + else if (info == 4) info = 5; + else if (info == 11) info = 9; + else if (info == 9) info = 11; + } + else if (strstr(rout, "symm") != 0 || strstr(rout, "hemm") != 0) + { + if (info == 5) info = 4; + else if (info == 4) info = 5; + } + else if (strstr(rout, "trmm") != 0 || strstr(rout, "trsm") != 0) + { + if (info == 7) info = 6; + else if (info == 6) info = 7; + } + else if (strstr(rout, "gemv") != 0) + { + if (info == 4) info = 3; + else if (info == 3) info = 4; + } + else if (strstr(rout, "gbmv") != 0) + { + if (info == 4) info = 3; + else if (info == 3) info = 4; + else if (info == 6) info = 5; + else if (info == 5) info = 6; + } + else if (strstr(rout, "ger") != 0) + { + if (info == 3) info = 2; + else if (info == 2) info = 3; + else if (info == 8) info = 6; + else if (info == 6) info = 8; + } + else if ((strstr(rout, "her2") != 0 || strstr(rout, "hpr2") != 0) + && strstr(rout, "her2k") == 0) + { + if (info == 8) info = 6; + else if (info == 6) info = 8; + } + } + if (info) + fprintf(stderr, "Parameter %d to routine %s was incorrect\n", info, rout); + vfprintf(stderr, form, argptr); + va_end(argptr); + if (info && !info) + F77_xerbla(empty, &info); /* Force link of our F77 error handler */ + exit(-1); +} +void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const int M, const int N, + const int K, const double alpha, const double *A, + const int lda, const double *B, const int ldb, + const double beta, double *C, const int ldc) +{ + char TA, TB; +#ifdef F77_CHAR + F77_CHAR F77_TA, F77_TB; +#else +#define F77_TA &TA +#define F77_TB &TB +#endif + +#ifdef F77_INT + F77_INT F77_M = M, F77_N = N, F77_K = K, F77_lda = lda, F77_ldb = ldb; + F77_INT F77_ldc = ldc; +#else +#define F77_M M +#define F77_N N +#define F77_K K +#define F77_lda lda +#define F77_ldb ldb +#define F77_ldc ldc +#endif + + RowMajorStrg = 0; + CBLAS_CallFromC = 1; + + if (layout == CblasColMajor) + { + if (TransA == CblasTrans) TA = 'T'; + else if (TransA == CblasConjTrans) TA = 'C'; + else if (TransA == CblasNoTrans) TA = 'N'; + else + { + cblas_xerbla(2, "cblas_dgemm", "Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + + if (TransB == CblasTrans) TB = 'T'; + else if (TransB == CblasConjTrans) TB = 'C'; + else if (TransB == CblasNoTrans) TB = 'N'; + else + { + cblas_xerbla(3, "cblas_dgemm", "Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); +#endif + + F77_dgemm(F77_TA, F77_TB, &F77_M, &F77_N, &F77_K, &alpha, A, + &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); + } + else if (layout == CblasRowMajor) + { + RowMajorStrg = 1; + if (TransA == CblasTrans) TB = 'T'; + else if (TransA == CblasConjTrans) TB = 'C'; + else if (TransA == CblasNoTrans) TB = 'N'; + else + { + cblas_xerbla(2, "cblas_dgemm", "Illegal TransA setting, %d\n", TransA); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } + if (TransB == CblasTrans) TA = 'T'; + else if (TransB == CblasConjTrans) TA = 'C'; + else if (TransB == CblasNoTrans) TA = 'N'; + else + { + cblas_xerbla(2, "cblas_dgemm", "Illegal TransB setting, %d\n", TransB); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; + } +#ifdef F77_CHAR + F77_TA = C2F_CHAR(&TA); + F77_TB = C2F_CHAR(&TB); +#endif + + F77_dgemm(F77_TA, F77_TB, &F77_N, &F77_M, &F77_K, &alpha, B, + &F77_ldb, A, &F77_lda, &beta, C, &F77_ldc); + } + else cblas_xerbla(1, "cblas_dgemm", "Illegal layout setting, %d\n", layout); + CBLAS_CallFromC = 0; + RowMajorStrg = 0; + return; +} +#endif + + int cvRound(float f) { return roundf(f); } #define CV_Error(code, msg) assert(0 && msg); // cv::error( code, msg, CV_Func, __FILE__, __LINE__ ) @@ -27,7 +193,7 @@ void cvCopyTo(const CvMat *srcarr, CvMat *dstarr) { void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src3, double beta, CvMat *dst, int tABC) { lapack_int rows1 = src1->rows; lapack_int cols1 = src1->cols; - + lapack_int rows2 = src2->rows; lapack_int cols2 = src2->cols; diff --git a/src/epnp/epnp.c b/src/epnp/epnp.c index 4b888aa..53a1d48 100644 --- a/src/epnp/epnp.c +++ b/src/epnp/epnp.c @@ -134,7 +134,7 @@ void epnp_choose_control_points(epnp *self) { // Take C1, C2, and C3 from PCA on the reference points: CvMat *PW0 = cvCreateMat(self->number_of_correspondences, 3, CV_64F); - double pw0tpw0[3 * 3] = {}, dc[3], uct[3 * 3]; + double pw0tpw0[3 * 3] = {0}, dc[3], uct[3 * 3]; CvMat PW0tPW0 = cvMat(3, 3, CV_64F, pw0tpw0); CvMat DC = cvMat(3, 1, CV_64F, dc); CvMat UCt = cvMat(3, 3, CV_64F, uct); diff --git a/src/poser_sba.c b/src/poser_sba.c index 0ad38ac..df28a2d 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -4,6 +4,7 @@ #endif #include +#include #include "poser.h" #include diff --git a/src/survive.c b/src/survive.c index f46f128..23b1e4c 100644 --- a/src/survive.c +++ b/src/survive.c @@ -110,6 +110,9 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { MANUAL_DRIVER_REGISTRATION(PoserCharlesSlow) MANUAL_DRIVER_REGISTRATION(PoserDaveOrtho) MANUAL_DRIVER_REGISTRATION(PoserDummy) + MANUAL_DRIVER_REGISTRATION(PoserEPNP) + MANUAL_DRIVER_REGISTRATION(PoserSBA) + MANUAL_DRIVER_REGISTRATION(DriverRegHTCVive) MANUAL_DRIVER_REGISTRATION(DriverRegPlayback) @@ -260,7 +263,7 @@ int survive_startup(SurviveContext *ctx) { // start the thread to process button data ctx->buttonservicethread = OGCreateThread(button_servicer, ctx); - PoserCB PreferredPoserCB = GetDriverByConfig(ctx, "Poser", "defaultposer", "TurveyTori", 2); + PoserCB PreferredPoserCB = GetDriverByConfig(ctx, "Poser", "defaultposer", "SBA", 2); ctx->lightcapfunction = GetDriverByConfig(ctx, "Disambiguator", "disambiguator", "Turvey", 2); const char *DriverName; diff --git a/src/survive_cal.c b/src/survive_cal.c index 25e43b9..2fc1896 100755 --- a/src/survive_cal.c +++ b/src/survive_cal.c @@ -187,7 +187,7 @@ void survive_cal_install( struct SurviveContext * ctx ) } const char * DriverName; - cd->ConfigPoserFn = GetDriverByConfig(ctx, "Poser", "configposer", "TurveyTori", 0); + cd->ConfigPoserFn = GetDriverByConfig(ctx, "Poser", "configposer", "SBA", 0); ootx_packet_clbk = ootx_packet_clbk_d; diff --git a/winbuild/calibrate/calibrate.vcxproj b/winbuild/calibrate/calibrate.vcxproj index 51519e6..d0b1c48 100644 --- a/winbuild/calibrate/calibrate.vcxproj +++ b/winbuild/calibrate/calibrate.vcxproj @@ -75,6 +75,7 @@ true + $(LibraryPath) false @@ -190,7 +191,17 @@ {435cfd2c-8724-42ee-8fde-71ef7d2c6b2f} + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/winbuild/calibrate/calibrate.vcxproj.filters b/winbuild/calibrate/calibrate.vcxproj.filters index dae64dc..1498023 100644 --- a/winbuild/calibrate/calibrate.vcxproj.filters +++ b/winbuild/calibrate/calibrate.vcxproj.filters @@ -36,4 +36,7 @@ Header Files + + + \ No newline at end of file diff --git a/winbuild/data_recorder/data_recorder.vcxproj b/winbuild/data_recorder/data_recorder.vcxproj index 59a1e77..e63d474 100644 --- a/winbuild/data_recorder/data_recorder.vcxproj +++ b/winbuild/data_recorder/data_recorder.vcxproj @@ -72,6 +72,7 @@ true + $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64 true diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index 6268d63..2451c22 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -56,6 +56,7 @@ + @@ -70,14 +71,17 @@ - + + $(IncludePath) + $(LibraryPath) + Level3 Disabled - FLT=double;USE_DOUBLE;MANUAL_REGISTRATION;NOZLIB;_CRT_SECURE_NO_WARNINGS;HIDAPI;WINDOWS;_DEBUG;_LIB;%(PreprocessorDefinitions) + FLT=double;USE_DOUBLE;MANUAL_REGISTRATION;NOZLIB;_CRT_SECURE_NO_WARNINGS;HIDAPI;WINDOWS;_DEBUG;_LIB;HAVE_LAPACK_CONFIG_H;LAPACK_COMPLEX_STRUCTURE;%(PreprocessorDefinitions) ..\..\winbuild;..\..\include\libsurvive;..\..\redist;%(AdditionalIncludeDirectories) @@ -89,6 +93,10 @@ $(MSBuildProjectDirectory)\libsurvive.def + + libblas.lib;liblapacke.lib;liblapack.lib%(AdditionalDependencies) + %(AdditionalLibraryDirectories) + @@ -149,14 +157,23 @@ + + + + + + + + + @@ -183,8 +200,11 @@ + + + @@ -193,8 +213,13 @@ + - - + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/winbuild/libsurvive/libsurvive.vcxproj.filters b/winbuild/libsurvive/libsurvive.vcxproj.filters index 5387108..ffddee9 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj.filters +++ b/winbuild/libsurvive/libsurvive.vcxproj.filters @@ -108,6 +108,33 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -152,8 +179,18 @@ Source Files + + Source Files + + + Header Files + + + Source Files + + \ No newline at end of file diff --git a/winbuild/libsurvive/packages.config b/winbuild/libsurvive/packages.config new file mode 100644 index 0000000..c283d9d --- /dev/null +++ b/winbuild/libsurvive/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/winbuild/test/test.vcxproj b/winbuild/test/test.vcxproj index e6ee3fb..5ceff3d 100644 --- a/winbuild/test/test.vcxproj +++ b/winbuild/test/test.vcxproj @@ -72,6 +72,8 @@ true + $(LibraryPath) + $(VC_ReferencesPath_x64); true @@ -93,7 +95,7 @@ Console - setupapi.lib;dbghelp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + setupapi.lib;dbghelp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;libblas.lib;liblapacke.lib;liblapack.lib;%(AdditionalDependencies) true UseFastLinkTimeCodeGeneration -- cgit v1.2.3 From 4856dd8d4121f23750baace5fd8bd81869f5ac81 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Thu, 29 Mar 2018 00:17:07 -0600 Subject: Filled out OO struct; most needed functions are there --- bindings/cs/Demo/Program.cs | 28 +++++++++++- bindings/cs/libsurvive.net/SurviveContext.cs | 65 ++++++++++++++++++--------- bindings/cs/libsurvive.net/cfunctions.cs | 67 +++++++++++++++------------- include/libsurvive/survive_types.h | 3 +- winbuild/libsurvive/libsurvive.vcxproj | 5 ++- 5 files changed, 114 insertions(+), 54 deletions(-) diff --git a/bindings/cs/Demo/Program.cs b/bindings/cs/Demo/Program.cs index 1644360..c03d83c 100644 --- a/bindings/cs/Demo/Program.cs +++ b/bindings/cs/Demo/Program.cs @@ -9,13 +9,39 @@ namespace Demo { internal class MyHandler : SurviveContext { - public MyHandler() + private static void WritePose(string name, SurvivePose pose) + { + Console.Out.WriteLine(name); + Console.Out.Write(" [ "); + for (int i = 0; i < 3; i++) + Console.Out.Write("{0} ", pose.Pos[i]); + Console.Out.Write(" ] [ "); + for (int i = 0; i < 4; i++) + Console.Out.Write("{0} ", pose.Rot[i]); + Console.Out.Write(" ] "); + Console.Out.WriteLine(); + } + + public MyHandler() : base() { } public MyHandler(string[] args) : base(args) { } + + protected void LightHouseEvent1(IntPtr ctx, byte lighthouse, SurvivePose lighthouse_pose, SurvivePose object_pose) + { + base.LightHouseEvent(ctx, lighthouse, lighthouse_pose, object_pose); + WritePose("Lighthouse", lighthouse_pose); + WritePose("Object", object_pose); + } + + protected override void PoseEvent(IntPtr so, byte lighthouse, SurvivePose pose) + { + WritePose("Pose", pose); + base.PoseEvent(so, lighthouse, pose); + } } class Program { diff --git a/bindings/cs/libsurvive.net/SurviveContext.cs b/bindings/cs/libsurvive.net/SurviveContext.cs index 1fb8c11..bafcf2b 100644 --- a/bindings/cs/libsurvive.net/SurviveContext.cs +++ b/bindings/cs/libsurvive.net/SurviveContext.cs @@ -18,6 +18,21 @@ namespace libsurvive public SurviveContext() : this(null) { } + /** + * We need to keep these delegates around for the lifespan of this object. + * if we just pass the functions in, it creates temporary delegates that + * disappear if we don't keep managed ref around + */ + light_process_func light_Process_Func; + raw_pose_func raw_Pose_Func; + lighthouse_pose_func lighthouse_Pose_Func; + angle_process_func angle_Process_Func; + button_process_func button_Process_Func; + htc_config_func htc_Config_Func; + imu_process_func imu_Process_Func; + text_feedback_func error_func; + text_feedback_func info_func; + public SurviveContext(string[] args) { string[] newArgs = new string[args.Length + 1]; @@ -26,60 +41,70 @@ namespace libsurvive ctx = cfunctions.survive_init_internal(newArgs.Length, newArgs); - cfunctions.survive_install_raw_pose_fn(ctx, PoseEvent); - cfunctions.survive_install_light_fn(ctx, LightEvent); - cfunctions.survive_install_lighthouse_pose_fn(ctx, LightHouseEvent); - cfunctions.survive_install_angle_fn(ctx, AngleEvent); - cfunctions.survive_install_button_fn(ctx, ButtonEvent); - cfunctions.survive_install_htc_config_fn(ctx, HTCConfigEvent); - cfunctions.survive_install_imu_fn(ctx, IMUEvent); - cfunctions.survive_install_error_fn(ctx, ErrorEvent); - cfunctions.survive_install_info_fn(ctx, InfoEvent); + light_Process_Func = LightEvent; + raw_Pose_Func = PoseEvent; + lighthouse_Pose_Func = LightHouseEvent; + angle_Process_Func = AngleEvent; + button_Process_Func = ButtonEvent; + htc_Config_Func = HTCConfigEvent; + imu_Process_Func = IMUEvent; + error_func = ErrorEvent; + info_func = InfoEvent; + + cfunctions.survive_install_raw_pose_fn(ctx, raw_Pose_Func); + cfunctions.survive_install_light_fn(ctx, light_Process_Func); + cfunctions.survive_install_lighthouse_pose_fn(ctx, lighthouse_Pose_Func); + cfunctions.survive_install_angle_fn(ctx, angle_Process_Func); + cfunctions.survive_install_button_fn(ctx, button_Process_Func); + cfunctions.survive_install_htc_config_fn(ctx, htc_Config_Func); + cfunctions.survive_install_imu_fn(ctx, imu_Process_Func); + cfunctions.survive_install_error_fn(ctx, error_func); + cfunctions.survive_install_info_fn(ctx, info_func); } - protected void InfoEvent(SurviveObjectPtr ctx, string fault) + virtual protected void InfoEvent(SurviveObjectPtr ctx, string fault) { Console.Out.WriteLine(fault); } - protected void ErrorEvent(SurviveObjectPtr ctx, string fault) + virtual protected void ErrorEvent(SurviveObjectPtr ctx, string fault) { Console.Error.WriteLine(fault); } - protected void IMUEvent(SurviveObjectPtr so, int mask, double[] accelgyro, uint timecode, int id) + virtual protected void IMUEvent(SurviveObjectPtr so, int mask, double[] accelgyro, uint timecode, int id) { cfunctions.survive_default_imu_process(so, mask, accelgyro, timecode, id); } - protected int HTCConfigEvent(SurviveObjectPtr so, string ct0conf, int len) + virtual protected int HTCConfigEvent(SurviveObjectPtr so, string ct0conf, int len) { return cfunctions.survive_default_htc_config_process(so, ct0conf, len); } - protected void ButtonEvent(SurviveObjectPtr so, byte eventType, byte buttonId, byte axis1Id, ushort axis1Val, byte axis2Id, ushort axis2Val) + virtual protected void ButtonEvent(SurviveObjectPtr so, byte eventType, byte buttonId, byte axis1Id, ushort axis1Val, byte axis2Id, ushort axis2Val) { cfunctions.survive_default_button_process(so, eventType, buttonId, axis1Id, axis1Val, axis2Id, axis2Val); } - protected void AngleEvent(SurviveObjectPtr so, int sensor_id, int acode, uint timecode, double length, double angle, uint lh) + virtual protected void AngleEvent(SurviveObjectPtr so, int sensor_id, int acode, uint timecode, double length, double angle, uint lh) { cfunctions.survive_default_angle_process(so, sensor_id, acode, timecode, length, angle, lh); } - protected void LightHouseEvent(SurviveObjectPtr ctx, byte lighthouse, ref SurvivePose lighthouse_pose, ref SurvivePose object_pose) + protected void LightHouseEvent(SurviveObjectPtr ctx, byte lighthouse, SurvivePose lighthouse_pose, SurvivePose object_pose) { - cfunctions.survive_default_lighthouse_pose_process(ctx, lighthouse, ref lighthouse_pose, ref object_pose); + cfunctions.survive_default_lighthouse_pose_process(ctx, lighthouse, lighthouse_pose, object_pose); } - protected void LightEvent(SurviveObjectPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse) + virtual protected void LightEvent(SurviveObjectPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse) { cfunctions.survive_default_light_process(so, sensor_id, acode, timeinsweep, timecode, length, lighthouse); } - protected void PoseEvent(IntPtr so, byte lighthouse, ref SurvivePose pose) + virtual protected void PoseEvent(IntPtr so, byte lighthouse, SurvivePose pose) { - cfunctions.survive_default_raw_pose_process(so, lighthouse, ref pose); + cfunctions.survive_default_raw_pose_process(so, lighthouse, pose); } public int Poll() diff --git a/bindings/cs/libsurvive.net/cfunctions.cs b/bindings/cs/libsurvive.net/cfunctions.cs index f9d88f0..760681e 100644 --- a/bindings/cs/libsurvive.net/cfunctions.cs +++ b/bindings/cs/libsurvive.net/cfunctions.cs @@ -10,7 +10,7 @@ namespace libsurvive using SurvivePosePtr = IntPtr; [StructLayout(LayoutKind.Sequential)] - public struct SurvivePose + public class SurvivePose { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public double[] Pos; // Position in the form xyz @@ -20,65 +20,72 @@ namespace libsurvive class cfunctions { - #pragma warning disable IDE1006 // Naming Styles - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall) ] public static extern SurviveContextPtr survive_init_internal(int argc, string[] args); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern SurviveContextPtr survive_close(SurviveContextPtr ctx); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern int survive_poll(SurviveContextPtr ctx); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern int survive_startup(SurviveContextPtr ctx); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_htc_config_fn(SurviveContextPtr ctx, htc_config_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_info_fn(SurviveContextPtr ctx, text_feedback_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_error_fn(SurviveContextPtr ctx, text_feedback_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_imu_fn(SurviveContextPtr ctx, imu_process_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_angle_fn(SurviveContextPtr ctx, angle_process_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_button_fn(SurviveContextPtr ctx, button_process_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_raw_pose_fn(SurviveContextPtr ctx, raw_pose_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_lighthouse_pose_fn(SurviveContextPtr ctx, lighthouse_pose_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_install_light_fn(SurviveContextPtr ctx, light_process_func fbp); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_cal_install(SurviveContextPtr ctx); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_default_light_process(SurviveObjectPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lh); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_default_imu_process(SurviveObjectPtr so, int mode, double[] accelgyro, UInt32 timecode, int id); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_default_angle_process(SurviveObjectPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern void survive_default_button_process(SurviveObjectPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); - [DllImport("libsurvive")] - public static extern void survive_default_raw_pose_process(SurviveObjectPtr so, byte lighthouse, ref SurvivePose pose); - [DllImport("libsurvive")] - public static extern void survive_default_lighthouse_pose_process(SurviveContextPtr ctx, byte lighthouse, ref SurvivePose lh_pose, - ref SurvivePose obj_pose); - [DllImport("libsurvive")] + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + public static extern void survive_default_raw_pose_process(SurviveObjectPtr so, byte lighthouse, SurvivePose pose); + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] + public static extern void survive_default_lighthouse_pose_process(SurviveContextPtr ctx, byte lighthouse, SurvivePose lh_pose, + SurvivePose obj_pose); + [DllImport("libsurvive", CallingConvention = CallingConvention.StdCall)] public static extern int survive_default_htc_config_process(SurviveObjectPtr so, string ct0conf, int len); #pragma warning restore IDE1006 // Naming Styles } - + [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate int htc_config_func(SurviveObjectPtr so, string ct0conf, int len); + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void text_feedback_func(SurviveContextPtr ctx, string fault); + [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void light_process_func(SurviveObjectPtr so, int sensor_id, int acode, int timeinsweep, UInt32 timecode, UInt32 length, UInt32 lighthouse); + [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void imu_process_func(SurviveObjectPtr so, int mask, double[] accelgyro, UInt32 timecode, int id); + [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void angle_process_func(SurviveObjectPtr so, int sensor_id, int acode, UInt32 timecode, double length, double angle, UInt32 lh); + [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void button_process_func(SurviveObjectPtr so, byte eventType, byte buttonId, byte axis1Id, UInt16 axis1Val, byte axis2Id, UInt16 axis2Val); - public delegate void raw_pose_func(SurviveObjectPtr so, byte lighthouse, ref SurvivePose pose); - public delegate void lighthouse_pose_func(SurviveContextPtr ctx, byte lighthouse, ref SurvivePose lighthouse_pose, - ref SurvivePose object_pose); + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + public delegate void raw_pose_func(SurviveObjectPtr so, byte lighthouse, SurvivePose pose); + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + public delegate void lighthouse_pose_func(SurviveContextPtr ctx, byte lighthouse, SurvivePose lighthouse_pose, SurvivePose object_pose); } diff --git a/include/libsurvive/survive_types.h b/include/libsurvive/survive_types.h index 160adda..7a7dbf1 100644 --- a/include/libsurvive/survive_types.h +++ b/include/libsurvive/survive_types.h @@ -50,8 +50,7 @@ typedef void (*imu_process_func)( SurviveObject * so, int mask, FLT * accelgyro, typedef void (*angle_process_func)( SurviveObject * so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh); typedef void(*button_process_func)(SurviveObject * so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); typedef void (*raw_pose_func)(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose); -typedef void (*lighthouse_pose_func)(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *lighthouse_pose, - SurvivePose *object_pose); +typedef void (*lighthouse_pose_func)(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *lighthouse_pose, SurvivePose *object_pose); // For lightcap, etc. Don't change this structure at all. Regular vive is dependent on it being exactly as-is. // When you write drivers, you can use this to send survive lightcap data. diff --git a/winbuild/libsurvive/libsurvive.vcxproj b/winbuild/libsurvive/libsurvive.vcxproj index 2451c22..5caa159 100644 --- a/winbuild/libsurvive/libsurvive.vcxproj +++ b/winbuild/libsurvive/libsurvive.vcxproj @@ -83,6 +83,7 @@ Disabled FLT=double;USE_DOUBLE;MANUAL_REGISTRATION;NOZLIB;_CRT_SECURE_NO_WARNINGS;HIDAPI;WINDOWS;_DEBUG;_LIB;HAVE_LAPACK_CONFIG_H;LAPACK_COMPLEX_STRUCTURE;%(PreprocessorDefinitions) ..\..\winbuild;..\..\include\libsurvive;..\..\redist;%(AdditionalIncludeDirectories) + Caret Windows @@ -213,7 +214,9 @@ - + + Designer + -- cgit v1.2.3 From d9d57e3cfb75b7ab447b321161fac4f1bf1542ca Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Thu, 29 Mar 2018 09:12:44 -0600 Subject: Update .gitignore --- .gitignore | 54 ++++++++++++++++++++++++++------------------------ bindings/cs/.gitignore | 3 --- 2 files changed, 28 insertions(+), 29 deletions(-) delete mode 100644 bindings/cs/.gitignore diff --git a/.gitignore b/.gitignore index ca87dd5..8cfd2be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,36 @@ +# Linux +.idea *.o +*.so lib +calibrate_client +calibrate test -winbuild/calibrate.exe -winbuild/calinfo/* -winbuild/calibrate.def -winbuild/udev[USB_DEV_LIGHTHOUSE] -winbuild/config.json -winbuild/x64/* -winbuild/calibrate/calinfo/* -winbuild/calibrate/config.json -winbuild/calibrate/x64/* -winbuild/libsurvive/x64/* -winbuild/data_recorder/x64/* -winbuild/.vs/* -*.user -*.ipch -winbuild/.vs/libsurvive/v15/.suo -*.tlog -winbuild/calibrate.exe -winbuild/calibrate.def +data_recorder +simple_pose_test + +# Temp files *~ */\#*\# \#*\# -*.so -calinfo -calibrate_client -calibrate -test -.idea + +# Tool output *.json *.csv -data_recorder -simple_pose_test \ No newline at end of file +calinfo/ +*.log + +# Windows specific +*.dll +*.exe +obj/ +bin/ +x64/ +packages +.vs/ +Debug/ +Release/ +*.VC.db +*.user +*.ipch +*.tlog diff --git a/bindings/cs/.gitignore b/bindings/cs/.gitignore deleted file mode 100644 index 6d14531..0000000 --- a/bindings/cs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.dll -obj/ -bin/ \ No newline at end of file -- cgit v1.2.3 From d366c1dc70487246e1a1948e33d8a998f54a82ae Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Thu, 29 Mar 2018 10:18:56 -0600 Subject: Removed unused code --- redist/minimal_opencv.c | 170 +----------------------------------------------- 1 file changed, 1 insertion(+), 169 deletions(-) diff --git a/redist/minimal_opencv.c b/redist/minimal_opencv.c index e35e31d..48bd85e 100644 --- a/redist/minimal_opencv.c +++ b/redist/minimal_opencv.c @@ -8,175 +8,7 @@ #include "string.h" #include -#include - -//#define DEBUG_PRINT - -#ifdef _WIN3211 -#include "cblas.h" - -int CBLAS_CallFromC; -int RowMajorStrg; -void cblas_xerbla(int info, const char *rout, const char *form, ...) -{ - extern int RowMajorStrg; - char empty[1] = ""; - va_list argptr; - - va_start(argptr, form); - - if (RowMajorStrg) - { - if (strstr(rout, "gemm") != 0) - { - if (info == 5) info = 4; - else if (info == 4) info = 5; - else if (info == 11) info = 9; - else if (info == 9) info = 11; - } - else if (strstr(rout, "symm") != 0 || strstr(rout, "hemm") != 0) - { - if (info == 5) info = 4; - else if (info == 4) info = 5; - } - else if (strstr(rout, "trmm") != 0 || strstr(rout, "trsm") != 0) - { - if (info == 7) info = 6; - else if (info == 6) info = 7; - } - else if (strstr(rout, "gemv") != 0) - { - if (info == 4) info = 3; - else if (info == 3) info = 4; - } - else if (strstr(rout, "gbmv") != 0) - { - if (info == 4) info = 3; - else if (info == 3) info = 4; - else if (info == 6) info = 5; - else if (info == 5) info = 6; - } - else if (strstr(rout, "ger") != 0) - { - if (info == 3) info = 2; - else if (info == 2) info = 3; - else if (info == 8) info = 6; - else if (info == 6) info = 8; - } - else if ((strstr(rout, "her2") != 0 || strstr(rout, "hpr2") != 0) - && strstr(rout, "her2k") == 0) - { - if (info == 8) info = 6; - else if (info == 6) info = 8; - } - } - if (info) - fprintf(stderr, "Parameter %d to routine %s was incorrect\n", info, rout); - vfprintf(stderr, form, argptr); - va_end(argptr); - if (info && !info) - F77_xerbla(empty, &info); /* Force link of our F77 error handler */ - exit(-1); -} -void cblas_dgemm(const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, - const CBLAS_TRANSPOSE TransB, const int M, const int N, - const int K, const double alpha, const double *A, - const int lda, const double *B, const int ldb, - const double beta, double *C, const int ldc) -{ - char TA, TB; -#ifdef F77_CHAR - F77_CHAR F77_TA, F77_TB; -#else -#define F77_TA &TA -#define F77_TB &TB -#endif - -#ifdef F77_INT - F77_INT F77_M = M, F77_N = N, F77_K = K, F77_lda = lda, F77_ldb = ldb; - F77_INT F77_ldc = ldc; -#else -#define F77_M M -#define F77_N N -#define F77_K K -#define F77_lda lda -#define F77_ldb ldb -#define F77_ldc ldc -#endif - - RowMajorStrg = 0; - CBLAS_CallFromC = 1; - - if (layout == CblasColMajor) - { - if (TransA == CblasTrans) TA = 'T'; - else if (TransA == CblasConjTrans) TA = 'C'; - else if (TransA == CblasNoTrans) TA = 'N'; - else - { - cblas_xerbla(2, "cblas_dgemm", "Illegal TransA setting, %d\n", TransA); - CBLAS_CallFromC = 0; - RowMajorStrg = 0; - return; - } - - if (TransB == CblasTrans) TB = 'T'; - else if (TransB == CblasConjTrans) TB = 'C'; - else if (TransB == CblasNoTrans) TB = 'N'; - else - { - cblas_xerbla(3, "cblas_dgemm", "Illegal TransB setting, %d\n", TransB); - CBLAS_CallFromC = 0; - RowMajorStrg = 0; - return; - } - -#ifdef F77_CHAR - F77_TA = C2F_CHAR(&TA); - F77_TB = C2F_CHAR(&TB); -#endif - - F77_dgemm(F77_TA, F77_TB, &F77_M, &F77_N, &F77_K, &alpha, A, - &F77_lda, B, &F77_ldb, &beta, C, &F77_ldc); - } - else if (layout == CblasRowMajor) - { - RowMajorStrg = 1; - if (TransA == CblasTrans) TB = 'T'; - else if (TransA == CblasConjTrans) TB = 'C'; - else if (TransA == CblasNoTrans) TB = 'N'; - else - { - cblas_xerbla(2, "cblas_dgemm", "Illegal TransA setting, %d\n", TransA); - CBLAS_CallFromC = 0; - RowMajorStrg = 0; - return; - } - if (TransB == CblasTrans) TA = 'T'; - else if (TransB == CblasConjTrans) TA = 'C'; - else if (TransB == CblasNoTrans) TA = 'N'; - else - { - cblas_xerbla(2, "cblas_dgemm", "Illegal TransB setting, %d\n", TransB); - CBLAS_CallFromC = 0; - RowMajorStrg = 0; - return; - } -#ifdef F77_CHAR - F77_TA = C2F_CHAR(&TA); - F77_TB = C2F_CHAR(&TB); -#endif - - F77_dgemm(F77_TA, F77_TB, &F77_N, &F77_M, &F77_K, &alpha, B, - &F77_ldb, A, &F77_lda, &beta, C, &F77_ldc); - } - else cblas_xerbla(1, "cblas_dgemm", "Illegal layout setting, %d\n", layout); - CBLAS_CallFromC = 0; - RowMajorStrg = 0; - return; -} -#endif - +#include int cvRound(float f) { return roundf(f); } #define CV_Error(code, msg) assert(0 && msg); // cv::error( code, msg, CV_Func, __FILE__, __LINE__ ) -- cgit v1.2.3 From ba4b64e3c7df19356ff867533b47257932df691f Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Thu, 29 Mar 2018 16:10:34 -0600 Subject: Made linmath sane for C++ inclusion --- redist/linmath.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/redist/linmath.h b/redist/linmath.h index 1a73a06..71fd9b0 100644 --- a/redist/linmath.h +++ b/redist/linmath.h @@ -3,6 +3,10 @@ #ifndef _LINMATH_H #define _LINMATH_H +#ifdef __cplusplus +extern "C" { +#endif + // Yes, I know it's kind of arbitrary. #define DEFAULT_EPSILON 0.001 @@ -140,4 +144,8 @@ Matrix3x3 inverseM33(const Matrix3x3 mat); void matrix44copy(FLT *mout, const FLT *minm); void matrix44transpose(FLT *mout, const FLT *minm); +#ifdef __cplusplus +} +#endif + #endif -- cgit v1.2.3 From 033111aa59de4a0277308efbc4405dd96c26f8f8 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Thu, 29 Mar 2018 16:11:15 -0600 Subject: Added config value to disable attempts at calibration --- src/survive_process.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/survive_process.c b/src/survive_process.c index ad7ce97..97fbc46 100644 --- a/src/survive_process.c +++ b/src/survive_process.c @@ -48,15 +48,19 @@ void survive_default_light_process( SurviveObject * so, int sensor_id, int acode FLT angle = (timeinsweep - so->timecenter_ticks) * (1./so->timecenter_ticks * 3.14159265359/2.0); //Need to now do angle correction. -#if 1 - BaseStationData * bsd = &ctx->bsd[base_station]; + static int use_bsd_cal = -1; + if(use_bsd_cal == -1) { + use_bsd_cal = survive_configi(ctx, "use-bsd-cal", SC_GET, 1); + } + if(use_bsd_cal) { + BaseStationData * bsd = &ctx->bsd[base_station]; - //XXX TODO: This seriously needs to be worked on. See: https://github.com/cnlohr/libsurvive/issues/18 - angle += bsd->fcalphase[axis]; -// angle += bsd->fcaltilt[axis] * predicted_angle(axis1); + //XXX TODO: This seriously needs to be worked on. See: https://github.com/cnlohr/libsurvive/issues/18 + angle += bsd->fcalphase[axis]; + // angle += bsd->fcaltilt[axis] * predicted_angle(axis1); - //TODO!!! -#endif + //TODO!!! + } FLT length_sec = length / (FLT)so->timebase_hz; ctx->angleproc( so, sensor_id, acode, timecode, length_sec, angle, lh); -- cgit v1.2.3 From 574a1243f49b92960e8121c13a349b4e0e800792 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 30 Mar 2018 09:42:24 -0600 Subject: Typo in makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c73f139..62ed5e8 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ REDISTS:=redist/json_helpers.o redist/linmath.o redist/jsmn.o redist/minimal_ope ifeq ($(UNAME), Darwin) REDISTS:=$(REDISTS) redist/hid-osx.c endif -LIBSURVIVE_CORE:=src/survive.o src/survive_usb.o src/survive_charlesbiguator.o src/survive_process.o src/ootx_decoder.o src/survive_driverman.o src/survive_default_devices.o src/survive_vive.o src/survive_playback.o src/survive_config.o src/survive_cal.o src/survive_reproject.o src/poser.o src/epnp/epnp.c src/survive_sensor_activations.o src/survive_turveybiguator.o src/survive_disambiguator.o src/survive_statebased_disambiguator.o +LIBSURVIVE_CORE:=src/survive.o src/survive_usb.o src/survive_charlesbiguator.o src/survive_process.o src/ootx_decoder.o src/survive_driverman.o src/survive_default_devices.o src/survive_vive.o src/survive_playback.o src/survive_config.o src/survive_cal.o src/survive_reproject.o src/poser.o src/epnp/epnp.o src/survive_sensor_activations.o src/survive_turveybiguator.o src/survive_disambiguator.o src/survive_statebased_disambiguator.o #If you want to use HIDAPI on Linux. #CFLAGS:=$(CFLAGS) -DHIDAPI -- cgit v1.2.3 From 443af4e8fb770d074f1ce729a40687f79d548a50 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 30 Mar 2018 09:43:20 -0600 Subject: Made is so that if rawlight data was available, angles don't playback --- src/survive_playback.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/survive_playback.c b/src/survive_playback.c index c73dd2f..6789a66 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -317,7 +317,8 @@ static int playback_poll(struct SurviveContext *ctx, void *_driver) { break; case 'L': case 'R': - parse_and_run_lightcode(line, driver); + if (driver->hasRawLight == false) + parse_and_run_lightcode(line, driver); break; case 'I': parse_and_run_imu(line, driver); -- cgit v1.2.3 From f6babcbe142b335aba09d9c9798ac5bd31f25144 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 30 Mar 2018 09:43:59 -0600 Subject: Added tool to help find the optimal calibration permutation --- tools/findoptimalconfig/Makefile | 15 ++ tools/findoptimalconfig/findoptimalconfig.cc | 332 +++++++++++++++++++++++++++ 2 files changed, 347 insertions(+) create mode 100644 tools/findoptimalconfig/Makefile create mode 100644 tools/findoptimalconfig/findoptimalconfig.cc diff --git a/tools/findoptimalconfig/Makefile b/tools/findoptimalconfig/Makefile new file mode 100644 index 0000000..5e14814 --- /dev/null +++ b/tools/findoptimalconfig/Makefile @@ -0,0 +1,15 @@ +all : findoptimalconfig + +SRT:=../.. + +LIBSURVIVE:=$(SRT)/lib/libsurvive.so + +CFLAGS:=-I$(SRT)/redist -I$(SRT)/include -O0 -g -DFLT=double -DUSE_DOUBLE #-fsanitize=address -fsanitize=undefined +LDFLAGS:=-lm -lpthread -llapacke -lcblas + +findoptimalconfig : findoptimalconfig.cc $(LIBSURVIVE) + g++ $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean : + rm -rf findoptimalconfig + diff --git a/tools/findoptimalconfig/findoptimalconfig.cc b/tools/findoptimalconfig/findoptimalconfig.cc new file mode 100644 index 0000000..543958b --- /dev/null +++ b/tools/findoptimalconfig/findoptimalconfig.cc @@ -0,0 +1,332 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +std::ostream &operator<<(std::ostream &o, const survive_calibration_options_config &self) { + o << "\t"; + if (!self.enable[0] && !self.enable[1]) { + o << "disabled"; + return o; + } + + o << "swap: " << self.swap << std::endl; + for (int i = 0; i < 2; i++) { + if (self.enable[i]) { + o << "\tinvert[" << i << "]: " << self.invert[i]; + } else { + o << "\t" << i << ": disabled"; + } + } + return o; +} + +std::ostream &operator<<(std::ostream &o, const survive_calibration_config &self) { + o << "Index: " << survive_calibration_config_index(&self) << std::endl; + o << "Phase: " << std::endl << self.phase << std::endl; + o << "Tilt: " << std::endl << self.tilt << std::endl; + o << "Curve: " << std::endl << self.curve << std::endl; + o << "gibPhase: " << std::endl << self.gibPhase << std::endl; + o << "gibMag: " << std::endl << self.gibMag << std::endl; + o << "gibUseSin: " << self.gibUseSin << std::endl; + return o; +} + +struct SBAData { + int last_acode = -1; + int last_lh = -1; + + int failures_to_reset = 1; + int failures_to_reset_cntr = 0; + int successes_to_reset = 1; + int successes_to_reset_cntr = 0; + + FLT sensor_variance = 1.; + FLT sensor_variance_per_second = 0; + int sensor_time_window = 1600000; + + int required_meas = 8; +}; + +struct PlaybackDataInput { + SurviveObject *so = nullptr; + SurvivePose position; + + std::vector vmask; + std::vector meas, cov; + PlaybackDataInput(SurviveObject *so, const SurvivePose &position) : so(so), position(position) { + int32_t sensor_count = so->sensor_ct; + vmask.resize(sensor_count * NUM_LIGHTHOUSES); + cov.resize(4 * sensor_count * NUM_LIGHTHOUSES); + meas.resize(2 * sensor_count * NUM_LIGHTHOUSES); + } + void shrink(size_t new_size) { + cov.resize(4 * new_size); + meas.resize(2 * new_size); + } + ~PlaybackDataInput() {} +}; + +struct PlaybackData { + BaseStationData bsd[2]; + std::vector inputs; +}; + +SBAData settings; +static size_t construct_input_from_scene(SurviveObject *so, uint32_t timestamp, char *vmask, double *meas, + double *cov) { + size_t rtn = 0; + auto scene = &so->activations; + for (size_t sensor = 0; sensor < so->sensor_ct; sensor++) { + for (size_t lh = 0; lh < 2; lh++) { + if (SurviveSensorActivations_isPairValid(scene, settings.sensor_time_window, timestamp, sensor, lh)) { + double *a = scene->angles[sensor][lh]; + vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; + + if (cov) { + *(cov++) = settings.sensor_variance + + std::abs((double)timestamp - scene->timecode[sensor][lh][0]) * + settings.sensor_variance_per_second / (double)so->timebase_hz; + *(cov++) = 0; + *(cov++) = 0; + *(cov++) = settings.sensor_variance + + std::abs((double)timestamp - scene->timecode[sensor][lh][1]) * + settings.sensor_variance_per_second / (double)so->timebase_hz; + } + meas[rtn++] = a[0]; + meas[rtn++] = a[1]; + } else { + vmask[sensor * NUM_LIGHTHOUSES + lh] = 0; + } + } + } + return rtn; +} +uint32_t timestamp; + +void light_process(SurviveObject *so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, + uint32_t lighthouse) { + timestamp = timecode; + survive_default_light_process(so, sensor_id, acode, timeinsweep, timecode, length, lighthouse); +} + +void raw_pose_process(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose) { + survive_default_raw_pose_process(so, lighthouse, pose); + PlaybackData *d = (PlaybackData *)so->ctx->user_ptr; + d->inputs.emplace_back(so, *pose); + auto &input = d->inputs.back(); + int meas = construct_input_from_scene(so, timestamp, &input.vmask.front(), &input.meas.front(), &input.cov.front()); + input.shrink(meas / 2); + if (meas / 2 < 12) + d->inputs.pop_back(); +} + +void lighthouse_process(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *pose, SurvivePose *obj_pose) { + survive_default_lighthouse_pose_process(ctx, lighthouse, pose, obj_pose); + PlaybackData *d = (PlaybackData *)ctx->user_ptr; + d->bsd[lighthouse] = ctx->bsd[lighthouse]; +} + +std::map> errors; + +typedef struct { + survive_calibration_config calibration_config; + SurviveObject *so; + SurvivePose obj_pose; +} sba_context; + +static void str_metric_function(int j, int i, double *bi, double *xij, void *adata) { + SurvivePose obj = *(SurvivePose *)bi; + int sensor_idx = j >> 1; + int lh = j & 1; + + sba_context *ctx = (sba_context *)(adata); + SurviveObject *so = ctx->so; + + assert(lh < 2); + assert(sensor_idx < so->sensor_ct); + + quatnormalize(obj.Rot, obj.Rot); + FLT xyz[3]; + ApplyPoseToPoint(xyz, &obj, &so->sensor_locations[sensor_idx * 3]); + + // std::cerr << "Processing " << sensor_idx << ", " << lh << std::endl; + SurvivePose *camera = &so->ctx->bsd[lh].Pose; + survive_reproject_from_pose_with_config(so->ctx, &ctx->calibration_config, lh, camera, xyz, xij); +} + +double sba_opt(SurviveContext *ctx, const survive_calibration_config &config, PlaybackDataInput &data) { + double *covx = 0; + SurviveObject *so = data.so; + + SurvivePose soLocation = data.position; + bool currentPositionValid = quatmagnitude(&soLocation.Rot[0]) != 0; + + double opts[SBA_OPTSSZ] = {0}; + double info[SBA_INFOSZ] = {0}; + + sba_context _ctx = {config, so}; + + opts[0] = SBA_INIT_MU; + opts[1] = SBA_STOP_THRESH; + opts[2] = SBA_STOP_THRESH; + opts[3] = SBA_STOP_THRESH; + opts[3] = SBA_STOP_THRESH; // max_reproj_error * meas.size(); + opts[4] = 0.0; + + int status = sba_str_levmar(1, // Number of 3d points + 0, // Number of 3d points to fix in spot + NUM_LIGHTHOUSES * so->sensor_ct, &data.vmask.front(), + soLocation.Pos, // Reads as the full pose though + 7, // pnp -- SurvivePose + &data.meas.front(), // x* -- measurement data + &data.cov.front(), // cov data + 2, // mnp -- 2 points per image + str_metric_function, + 0, // jacobia of metric_func + &_ctx, // user data + 50, // Max iterations + 0, // verbosity + opts, // options + info); // info + + if (status > 0) { + } else { + assert(false); + } + int meas_size = data.meas.size() / 2; + if (meas_size == 0) + return 0; + + { + SurviveContext *ctx = so->ctx; + // Docs say info[0] should be divided by meas; I don't buy it really... + static int cnt = 0; + if (cnt++ > 1000) { + SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (int)meas_size); + SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); + cnt = 0; + } + } + assert(!isinf(info[1])); + return info[1] / meas_size * 2; +} + +double find_avg_reproj_error(SurviveContext *ctx, const survive_calibration_config &config, PlaybackDataInput &data) { + auto vmask = &data.vmask.front(); + auto cov = &data.cov.front(); + auto meas = &data.meas.front(); + double err = 0; + size_t cnt = 0; + + err += sba_opt(ctx, config, data); + /* + for (size_t sensor = 0; sensor < data.so->sensor_ct; sensor++) { + for (size_t lh = 0; lh < 2; lh++) { + if( *(vmask++) ) { + cnt++; + FLT pt[3]; + ApplyPoseToPoint(pt, &data.position, data.so->sensor_locations + sensor * 3); + + FLT reproj_meas[2]; + survive_reproject_from_pose_with_config(ctx, &config, lh, &ctx->bsd[lh].Pose, pt, reproj_meas); + + auto x = reproj_meas[0] - meas[0]; + auto y = reproj_meas[1] - meas[1]; + err += cov[0]*x*x + cov[2]*y*y; + + meas += 2; + cov += 4; + } + } + }*/ + return err; +} + +double find_avg_reproj_error(SurviveContext *ctx, const survive_calibration_config &config, PlaybackData &data) { + double err = 0; + for (auto &in : data.inputs) { + err += find_avg_reproj_error(ctx, config, in); + } + return err / data.inputs.size(); +} + +int main(int argc, char **argv) { + std::vector> sections = { + {28, 0}, // phase + // { 5, 5 }, // tilt + // { 5, 10 }, // curve + // { 11, 15 } // gibs + useSin + }; + + for (int i = 1; i < argc; i++) { + PlaybackData data; + + char const *args[] = {argv[0], + "--use-bsd-cal", + "0", + "--calibrate", + "--playback-factor", + "0", + "--disambiguator", + "StateBased", + "--defaultposer", + "SBA", + "--sba-required-meas", + "12", + "--playback", + argv[i]}; + + auto ctx = survive_init(sizeof(args) / sizeof(args[0]), (char *const *)args); + ctx->user_ptr = &data; + + survive_install_raw_pose_fn(ctx, raw_pose_process); + survive_install_lighthouse_pose_fn(ctx, lighthouse_process); + survive_install_light_fn(ctx, light_process); + + while (survive_poll(ctx) == 0) { + } + + for (int j = 0; j < sections.size(); j++) { + auto &range = sections[j]; + for (size_t _i = 0; _i < (1 << range.first); _i++) { + int i = _i << range.second; + survive_calibration_config config = survive_calibration_config_create_from_idx(i); + if (i == survive_calibration_config_index(&config)) { + double error = find_avg_reproj_error(ctx, config, data); + errors[j][i] += error; + } + } + std::cerr << "Finished grouping " << j << std::endl; + } + + survive_close(ctx); + } + + for (int i = 0; i < errors.size(); i++) { + std::cout << "Grouping " << i << std::endl; + auto compFunctor = [](std::pair elem1, std::pair elem2) { + if (elem1.second == elem2.second) + return elem1.first < elem2.first; + return elem1.second < elem2.second; + }; + + std::set, typeof(compFunctor)> set(errors[i].begin(), errors[i].end(), compFunctor); + + for (auto err : set) { + survive_calibration_config config = survive_calibration_config_create_from_idx(err.first); + if (err.first == survive_calibration_config_index(&config)) { + double error = err.second; + std::cout << "Config " << err.first << " " << error << std::endl; + std::cout << config << std::endl; + } + } + } + return 0; +} -- cgit v1.2.3 From 52bcccaea5de63a4de4b3df17236507455776409 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 30 Mar 2018 09:50:24 -0600 Subject: Added accessors for language bindings --- include/libsurvive/survive.h | 5 +++++ src/survive.c | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/include/libsurvive/survive.h b/include/libsurvive/survive.h index 85078f7..ed43ddc 100644 --- a/include/libsurvive/survive.h +++ b/include/libsurvive/survive.h @@ -119,6 +119,11 @@ struct SurviveObject int tsl; }; +// These exports are mostly for language binding against +SURVIVE_EXPORT const char *survive_object_codename(SurviveObject *so); +SURVIVE_EXPORT int8_t survive_object_sensor_ct(SurviveObject *so); +SURVIVE_EXPORT const FLT *survive_object_sensor_locations(SurviveObject *so); +SURVIVE_EXPORT const FLT *survive_object_sensor_normals(SurviveObject *so); struct BaseStationData { diff --git a/src/survive.c b/src/survive.c index 23b1e4c..b359669 100644 --- a/src/survive.c +++ b/src/survive.c @@ -551,4 +551,9 @@ int survive_simple_inflate(struct SurviveContext *ctx, const char *input, int in return len; } +const char *survive_object_codename(SurviveObject *so) { return so->codename; } +int8_t survive_object_sensor_ct(SurviveObject *so) { return so->sensor_ct; } +const FLT *survive_object_sensor_locations(SurviveObject *so) { return so->sensor_locations; } +const FLT *survive_object_sensor_normals(SurviveObject *so) { return so->sensor_normals; } + #endif -- cgit v1.2.3 From 030ec10de98b40750ed480499d84cf8b7bcd766c Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 30 Mar 2018 12:00:07 -0600 Subject: Don't export minimal opencv symbols --- redist/minimal_opencv.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/redist/minimal_opencv.c b/redist/minimal_opencv.c index 48bd85e..371d6f8 100644 --- a/redist/minimal_opencv.c +++ b/redist/minimal_opencv.c @@ -10,7 +10,14 @@ #include #include -int cvRound(float f) { return roundf(f); } + +#ifdef _WIN32 +#define SURVIVE_LOCAL_ONLY +#else +#define SURVIVE_LOCAL_ONLY __attribute__ ((visibility ("hidden"))) +#endif + +SURVIVE_LOCAL_ONLY int cvRound(float f) { return roundf(f); } #define CV_Error(code, msg) assert(0 && msg); // cv::error( code, msg, CV_Func, __FILE__, __LINE__ ) const int DECOMP_SVD = 1; @@ -18,11 +25,11 @@ const int DECOMP_LU = 2; void print_mat(const CvMat *M); -void cvCopyTo(const CvMat *srcarr, CvMat *dstarr) { +SURVIVE_LOCAL_ONLY void cvCopyTo(const CvMat *srcarr, CvMat *dstarr) { memcpy(dstarr->data.db, srcarr->data.db, sizeof(double) * dstarr->rows * dstarr->cols); } -void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src3, double beta, CvMat *dst, int tABC) { +SURVIVE_LOCAL_ONLY void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src3, double beta, CvMat *dst, int tABC) { lapack_int rows1 = src1->rows; lapack_int cols1 = src1->cols; @@ -46,7 +53,7 @@ void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src lda, src2->data.db, ldb, beta, dst->data.db, dst->cols); } -void cvMulTransposed(const CvMat *src, CvMat *dst, int order, const CvMat *delta, double scale) { +SURVIVE_LOCAL_ONLY void cvMulTransposed(const CvMat *src, CvMat *dst, int order, const CvMat *delta, double scale) { lapack_int rows = src->rows; lapack_int cols = src->cols; @@ -65,14 +72,14 @@ void cvMulTransposed(const CvMat *src, CvMat *dst, int order, const CvMat *delta scale, src->data.db, cols, src->data.db, cols, beta, dst->data.db, dstCols); } -void *cvAlloc(size_t size) { return malloc(size); } +SURVIVE_LOCAL_ONLY void *cvAlloc(size_t size) { return malloc(size); } -static void icvCheckHuge(CvMat *arr) { +SURVIVE_LOCAL_ONLY static void icvCheckHuge(CvMat *arr) { if ((int64_t)arr->step * arr->rows > INT_MAX) arr->type &= ~CV_MAT_CONT_FLAG; } -CvMat *cvCreateMatHeader(int rows, int cols, int type) { +SURVIVE_LOCAL_ONLY CvMat *cvCreateMatHeader(int rows, int cols, int type) { type = CV_MAT_TYPE(type); assert(!(rows < 0 || cols < 0)); @@ -104,17 +111,17 @@ CvMat *cvCreateMatHeader(int rows, int cols, int type) { #define CV_DbgAssert assert -static inline void *cvAlignPtr(const void *ptr, int align) { +SURVIVE_LOCAL_ONLY static inline void *cvAlignPtr(const void *ptr, int align) { CV_DbgAssert((align & (align - 1)) == 0); return (void *)(((size_t)ptr + align - 1) & ~(size_t)(align - 1)); } -static inline int cvAlign(int size, int align) { +SURVIVE_LOCAL_ONLY static inline int cvAlign(int size, int align) { CV_DbgAssert((align & (align - 1)) == 0 && size < INT_MAX); return (size + align - 1) & -align; } -void cvCreateData(CvMat *arr) { +SURVIVE_LOCAL_ONLY void cvCreateData(CvMat *arr) { if (CV_IS_MAT_HDR_Z(arr)) { size_t step, total_size; CvMat *mat = (CvMat *)arr; @@ -142,14 +149,14 @@ void cvCreateData(CvMat *arr) { CV_Error(CV_StsBadArg, "unrecognized or unsupported array type"); } -CvMat *cvCreateMat(int height, int width, int type) { +SURVIVE_LOCAL_ONLY CvMat *cvCreateMat(int height, int width, int type) { CvMat *arr = cvCreateMatHeader(height, width, type); cvCreateData(arr); return arr; } -double cvInvert(const CvMat *srcarr, CvMat *dstarr, int method) { +SURVIVE_LOCAL_ONLY double cvInvert(const CvMat *srcarr, CvMat *dstarr, int method) { lapack_int inf; lapack_int rows = srcarr->rows; lapack_int cols = srcarr->cols; @@ -204,13 +211,13 @@ double cvInvert(const CvMat *srcarr, CvMat *dstarr, int method) { return 0; } -CvMat *cvCloneMat(const CvMat *mat) { +SURVIVE_LOCAL_ONLY CvMat *cvCloneMat(const CvMat *mat) { CvMat *rtn = cvCreateMat(mat->rows, mat->cols, mat->type); cvCopyTo(mat, rtn); return rtn; } -int cvSolve(const CvMat *Aarr, const CvMat *xarr, CvMat *Barr, int method) { +SURVIVE_LOCAL_ONLY int cvSolve(const CvMat *Aarr, const CvMat *xarr, CvMat *Barr, int method) { lapack_int inf; lapack_int arows = Aarr->rows; lapack_int acols = Aarr->cols; @@ -286,7 +293,7 @@ int cvSolve(const CvMat *Aarr, const CvMat *xarr, CvMat *Barr, int method) { return 0; } -void cvTranspose(const CvMat *M, CvMat *dst) { +SURVIVE_LOCAL_ONLY void cvTranspose(const CvMat *M, CvMat *dst) { bool inPlace = M == dst || M->data.db == dst->data.db; double *src = M->data.db; @@ -309,7 +316,7 @@ void cvTranspose(const CvMat *M, CvMat *dst) { } } -void cvSVD(CvMat *aarr, CvMat *warr, CvMat *uarr, CvMat *varr, int flags) { +SURVIVE_LOCAL_ONLY void cvSVD(CvMat *aarr, CvMat *warr, CvMat *uarr, CvMat *varr, int flags) { char jobu = 'A'; char jobvt = 'A'; @@ -347,13 +354,13 @@ void cvSVD(CvMat *aarr, CvMat *warr, CvMat *uarr, CvMat *varr, int flags) { } } -void cvSetZero(CvMat *arr) { +SURVIVE_LOCAL_ONLY void cvSetZero(CvMat *arr) { for (int i = 0; i < arr->rows; i++) for (int j = 0; j < arr->cols; j++) arr->data.db[i * arr->cols + j] = 0; } -void cvReleaseMat(CvMat **mat) { +SURVIVE_LOCAL_ONLY void cvReleaseMat(CvMat **mat) { assert(*(*mat)->refcount == 1); free((*mat)->refcount); free(*mat); -- cgit v1.2.3 From 053750ef27c996822512f75f55c0110f573eccd6 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Fri, 30 Mar 2018 12:33:11 -0600 Subject: Made manual driver registration only ever happen once --- src/survive.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/survive.c b/src/survive.c index b359669..a15e0ed 100644 --- a/src/survive.c +++ b/src/survive.c @@ -36,8 +36,8 @@ static void survivefault(struct SurviveContext *ctx, const char *fault) { } static void survivenote(struct SurviveContext *ctx, const char *fault) { - survive_recording_info_process(ctx, fault); - fprintf(stderr, "Info: %s\n", fault); + survive_recording_info_process(ctx, fault); + fprintf(stderr, "Info: %s\n", fault); } static void *button_servicer(void *context) { @@ -86,8 +86,9 @@ void survive_verify_FLT_size(uint32_t user_size) { if (sizeof(FLT) != user_size) { fprintf(stderr, "FLT type incompatible; the shared library libsurvive has FLT size %lu vs user program %u\n", (unsigned long)sizeof(FLT), user_size); - fprintf(stderr, "Add '#define FLT %s' before including survive.h or recompile the shared library with the " - "appropriate flag. \n", + fprintf(stderr, + "Add '#define FLT %s' before including survive.h or recompile the shared library with the " + "appropriate flag. \n", sizeof(FLT) == sizeof(double) ? "double" : "float"); exit(-1); } @@ -101,24 +102,28 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { } #endif #ifdef MANUAL_REGISTRATION -// note: this manual registration is currently only in use on builds using Visual Studio. + // note: this manual registration is currently only in use on builds using Visual Studio. + static int did_manual_driver_registration = 0; + if (did_manual_driver_registration == 0) { #define MANUAL_DRIVER_REGISTRATION(func) \ int func(SurviveObject *so, PoserData *pd); \ RegisterDriver(#func, &func); - MANUAL_DRIVER_REGISTRATION(PoserCharlesSlow) - MANUAL_DRIVER_REGISTRATION(PoserDaveOrtho) - MANUAL_DRIVER_REGISTRATION(PoserDummy) - MANUAL_DRIVER_REGISTRATION(PoserEPNP) - MANUAL_DRIVER_REGISTRATION(PoserSBA) + MANUAL_DRIVER_REGISTRATION(PoserCharlesSlow) + MANUAL_DRIVER_REGISTRATION(PoserDaveOrtho) + MANUAL_DRIVER_REGISTRATION(PoserDummy) + MANUAL_DRIVER_REGISTRATION(PoserEPNP) + MANUAL_DRIVER_REGISTRATION(PoserSBA) - MANUAL_DRIVER_REGISTRATION(DriverRegHTCVive) - MANUAL_DRIVER_REGISTRATION(DriverRegPlayback) + MANUAL_DRIVER_REGISTRATION(DriverRegHTCVive) + MANUAL_DRIVER_REGISTRATION(DriverRegPlayback) - MANUAL_DRIVER_REGISTRATION(DisambiguatorCharles) - MANUAL_DRIVER_REGISTRATION(DisambiguatorStateBased) - MANUAL_DRIVER_REGISTRATION(DisambiguatorTurvey) + MANUAL_DRIVER_REGISTRATION(DisambiguatorCharles) + MANUAL_DRIVER_REGISTRATION(DisambiguatorStateBased) + MANUAL_DRIVER_REGISTRATION(DisambiguatorTurvey) + did_manual_driver_registration = 1; + } #endif SurviveContext *ctx = calloc(1, sizeof(SurviveContext)); @@ -316,9 +321,9 @@ int survive_startup(SurviveContext *ctx) { // If lighthouse positions are known, broadcast them for (int i = 0; i < ctx->activeLighthouses; i++) { - if(ctx->bsd[i].PositionSet) { - ctx->lighthouseposeproc(ctx, i, &ctx->bsd[i].Pose, 0); - } + if (ctx->bsd[i].PositionSet) { + ctx->lighthouseposeproc(ctx, i, &ctx->bsd[i].Pose, 0); + } } return 0; -- cgit v1.2.3 From c4f0028c0123f7e957db05c3486c16e58388a27a Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sat, 31 Mar 2018 23:35:30 -0600 Subject: Noise filtering in state based dis --- src/survive_statebased_disambiguator.c | 39 +++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/survive_statebased_disambiguator.c b/src/survive_statebased_disambiguator.c index 4aa47ba..6b217ee 100644 --- a/src/survive_statebased_disambiguator.c +++ b/src/survive_statebased_disambiguator.c @@ -343,7 +343,7 @@ static void RunACodeCapture(int target_acode, Disambiguator_data_t *d, const Lig if (d->confidence < penalty) { SurviveContext *ctx = d->so->ctx; SetState(d, le, LS_UNKNOWN); - SV_INFO("WARNING: Disambiguator got lost; refinding state."); + SV_INFO("WARNING: Disambiguator got lost; refinding state for %s", d->so->codename); } d->confidence -= penalty; return; @@ -385,22 +385,40 @@ static void ProcessStateChange(Disambiguator_data_t *d, const LightcapElement *l } } else { // Leaving a sweep ... + size_t avg_length = 0; + size_t cnt = 0; + for (int i = 0; i < d->so->sensor_ct; i++) { LightcapElement le = d->sweep_data[i]; // Only care if we actually have data AND we have a time of last sync. We won't have the latter // if we synced with the LH at cetain times. if (le.length > 0 && d->time_of_last_sync[LS_Params[d->state].lh] > 0) { - int32_t offset_from = - timestamp_diff(le.timestamp + le.length / 2, d->time_of_last_sync[LS_Params[d->state].lh]); - - // Send the lightburst out. - assert(offset_from > 0); - d->so->ctx->lightproc(d->so, i, LS_Params[d->state].acode, offset_from, le.timestamp, le.length, - LS_Params[d->state].lh); + avg_length += le.length; + cnt++; + } + } + if (cnt > 0) { + double var = 1.5; + size_t minl = (1 / var) * (avg_length + cnt / 2) / cnt; + size_t maxl = var * (avg_length + cnt / 2) / cnt; + + for (int i = 0; i < d->so->sensor_ct; i++) { + LightcapElement le = d->sweep_data[i]; + // Only care if we actually have data AND we have a time of last sync. We won't have the latter + // if we synced with the LH at certain times. + if (le.length > 0 && d->time_of_last_sync[LS_Params[d->state].lh] > 0 && le.length >= minl && + le.length <= maxl) { + int32_t offset_from = + timestamp_diff(le.timestamp + le.length / 2, d->time_of_last_sync[LS_Params[d->state].lh]); + + // Send the lightburst out. + if (offset_from > 0) + d->so->ctx->lightproc(d->so, i, LS_Params[d->state].acode, offset_from, le.timestamp, le.length, + LS_Params[d->state].lh); + } } } } - SetState(d, le, new_state); } @@ -421,7 +439,8 @@ static void PropagateState(Disambiguator_data_t *d, const LightcapElement *le) { const LighthouseStateParameters *param = &LS_Params[d->state]; if (param->is_sweep == 0) { RunACodeCapture(param->acode, d, le); - } else if (le->length > d->sweep_data[le->sensor_id].length) { + } else if (le->length > d->sweep_data[le->sensor_id].length && + le->length < 7000 /*anything above 10k seems to be bullshit?*/) { // Note we only select the highest length one per sweep. Also, we bundle everything up and send it later all at // once. // so that we can do this filtering. Might not be necessary? -- cgit v1.2.3 From 20df0ee2c7711f9768173845dca1794b0fcf16fa Mon Sep 17 00:00:00 2001 From: Charles Lohr Date: Sun, 1 Apr 2018 06:00:30 +0000 Subject: add config for Orangepi Linux Next --- useful_files/config_for_orangepi_linux_sunxi-next | 4043 +++++++++++++++++++++ 1 file changed, 4043 insertions(+) create mode 100644 useful_files/config_for_orangepi_linux_sunxi-next diff --git a/useful_files/config_for_orangepi_linux_sunxi-next b/useful_files/config_for_orangepi_linux_sunxi-next new file mode 100644 index 0000000..0624fd8 --- /dev/null +++ b/useful_files/config_for_orangepi_linux_sunxi-next @@ -0,0 +1,4043 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm 4.16.0-rc3 Kernel Configuration +# +CONFIG_ARM=y +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_MIGHT_HAVE_PCI=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_HAVE_PROC_CPU=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_GENERIC_BUG=y +CONFIG_PGTABLE_LEVELS=2 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_EXTABLE_SORT=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_CROSS_COMPILE="" +# CONFIG_COMPILE_TEST is not set +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SWAP=y +# CONFIG_SYSVIPC is not set +# CONFIG_POSIX_MQUEUE is not set +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_USELIB is not set +# CONFIG_AUDIT is not set +CONFIG_HAVE_ARCH_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +CONFIG_ARCH_CLOCKSOURCE_DATA=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +# CONFIG_TASKS_RCU is not set +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# CONFIG_BUILD_BIN2C is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_CGROUPS=y +# CONFIG_MEMCG is not set +# CONFIG_BLK_CGROUP is not set +# CONFIG_CGROUP_SCHED is not set +# CONFIG_CGROUP_PIDS is not set +# CONFIG_CGROUP_RDMA is not set +# CONFIG_CGROUP_FREEZER is not set +# CONFIG_CPUSETS is not set +# CONFIG_CGROUP_DEVICE is not set +# CONFIG_CGROUP_CPUACCT is not set +# CONFIG_CGROUP_PERF is not set +# CONFIG_SOCK_CGROUP_DATA is not set +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +# CONFIG_USER_NS is not set +CONFIG_PID_NS=y +CONFIG_NET_NS=y +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +# CONFIG_RELAY is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_RD_XZ=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y +CONFIG_HAVE_UID16=y +CONFIG_BPF=y +# CONFIG_EXPERT is not set +CONFIG_UID16=y +CONFIG_MULTIUSER=y +# CONFIG_SGETMASK_SYSCALL is not set +CONFIG_SYSFS_SYSCALL=y +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_PRINTK_NMI=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +# CONFIG_CHECKPOINT_RESTORE is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set +CONFIG_KALLSYMS_BASE_RELATIVE=y +# CONFIG_BPF_SYSCALL is not set +# CONFIG_USERFAULTFD is not set +# CONFIG_EMBEDDED is not set +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_PERF_USE_VMALLOC=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +CONFIG_COMPAT_BRK=y +# CONFIG_SLAB is not set +CONFIG_SLUB=y +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +CONFIG_SLUB_CPU_PARTIAL=y +CONFIG_SYSTEM_DATA_VERIFICATION=y +# CONFIG_PROFILING is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +# CONFIG_JUMP_LABEL is not set +# CONFIG_UPROBES is not set +# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_NMI=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_DMA_API_DEBUG=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_HAVE_GCC_PLUGINS=y +# CONFIG_GCC_PLUGINS is not set +CONFIG_HAVE_CC_STACKPROTECTOR=y +# CONFIG_CC_STACKPROTECTOR_NONE is not set +# CONFIG_CC_STACKPROTECTOR_REGULAR is not set +# CONFIG_CC_STACKPROTECTOR_STRONG is not set +CONFIG_CC_STACKPROTECTOR_AUTO=y +CONFIG_THIN_ARCHIVES=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_BITS_MAX=16 +CONFIG_ARCH_MMAP_RND_BITS=8 +# CONFIG_HAVE_ARCH_HASH is not set +# CONFIG_ISA_BUS_API is not set +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_OLD_SIGACTION=y +# CONFIG_CPU_NO_EFFICIENT_FFS is not set +# CONFIG_HAVE_ARCH_VMAP_STACK is not set +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_ARCH_HAS_PHYS_TO_DMA=y +CONFIG_REFCOUNT_FULL=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_LBDAF=y +CONFIG_BLK_SCSI_REQUEST=y +CONFIG_BLK_DEV_BSG=y +# CONFIG_BLK_DEV_BSGLIB is not set +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_ZONED is not set +# CONFIG_BLK_CMDLINE_PARSER is not set +# CONFIG_BLK_WBT is not set +CONFIG_BLK_DEBUG_FS=y +# CONFIG_BLK_SED_OPAL is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_MQ_IOSCHED_DEADLINE=y +CONFIG_MQ_IOSCHED_KYBER=y +# CONFIG_IOSCHED_BFQ is not set +CONFIG_ASN1=y +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y +CONFIG_INLINE_READ_UNLOCK=y +CONFIG_INLINE_READ_UNLOCK_IRQ=y +CONFIG_INLINE_WRITE_UNLOCK=y +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_FREEZER=y + +# +# System Type +# +CONFIG_MMU=y +CONFIG_ARCH_MULTIPLATFORM=y +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_EP93XX is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_NETX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_DOVE is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_W90X900 is not set +# CONFIG_ARCH_LPC32XX is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C24XX is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP1 is not set + +# +# Multiple platform selection +# + +# +# CPU Core family selection +# +# CONFIG_ARCH_MULTI_V6 is not set +CONFIG_ARCH_MULTI_V7=y +CONFIG_ARCH_MULTI_V6_V7=y +# CONFIG_ARCH_MULTI_CPU_AUTO is not set +# CONFIG_ARCH_VIRT is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_ALPINE is not set +# CONFIG_ARCH_ARTPEC is not set +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_BCM is not set +# CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_DIGICOLOR is not set +# CONFIG_ARCH_HIGHBANK is not set +# CONFIG_ARCH_HISI is not set +# CONFIG_ARCH_KEYSTONE is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_MEDIATEK is not set + +# +# TI OMAP/AM/DM/DRA Family +# +# CONFIG_ARCH_OMAP3 is not set +# CONFIG_ARCH_OMAP4 is not set +# CONFIG_SOC_OMAP5 is not set +# CONFIG_SOC_AM33XX is not set +# CONFIG_SOC_AM43XX is not set +# CONFIG_SOC_DRA7XX is not set +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_ROCKCHIP is not set +# CONFIG_ARCH_SOCFPGA is not set +# CONFIG_PLAT_SPEAR is not set +# CONFIG_ARCH_STI is not set +# CONFIG_ARCH_S5PV210 is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_RENESAS is not set +CONFIG_ARCH_SUNXI=y +CONFIG_MACH_SUN4I=y +CONFIG_MACH_SUN5I=y +CONFIG_MACH_SUN6I=y +CONFIG_MACH_SUN7I=y +CONFIG_MACH_SUN8I=y +CONFIG_MACH_SUN9I=y +CONFIG_ARCH_SUNXI_MC_SMP=y +# CONFIG_ARCH_SIRF is not set +# CONFIG_ARCH_TANGO is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_U8500 is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_WM8850 is not set +# CONFIG_ARCH_ZX is not set +# CONFIG_ARCH_ZYNQ is not set + +# +# Processor Type +# +CONFIG_CPU_V7=y +CONFIG_CPU_THUMB_CAPABLE=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_LPAE is not set +# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set +CONFIG_ARM_THUMB=y +# CONFIG_ARM_THUMBEE is not set +CONFIG_ARM_VIRT_EXT=y +CONFIG_SWP_EMULATE=y +# CONFIG_CPU_BIG_ENDIAN is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_BPREDICT_DISABLE is not set +CONFIG_KUSER_HELPERS=y +CONFIG_VDSO=y +CONFIG_OUTER_CACHE=y +CONFIG_OUTER_CACHE_SYNC=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +CONFIG_CACHE_L2X0=y +# CONFIG_CACHE_L2X0_PMU is not set +# CONFIG_PL310_ERRATA_588369 is not set +# CONFIG_PL310_ERRATA_727915 is not set +# CONFIG_PL310_ERRATA_753970 is not set +# CONFIG_PL310_ERRATA_769419 is not set +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_DMA_MEM_BUFFERABLE=y +CONFIG_ARM_HEAVY_MB=y +CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y +CONFIG_DEBUG_ALIGN_RODATA=y +CONFIG_MULTI_IRQ_HANDLER=y +# CONFIG_ARM_ERRATA_430973 is not set +CONFIG_ARM_ERRATA_643719=y +# CONFIG_ARM_ERRATA_720789 is not set +# CONFIG_ARM_ERRATA_754322 is not set +# CONFIG_ARM_ERRATA_754327 is not set +# CONFIG_ARM_ERRATA_764369 is not set +# CONFIG_ARM_ERRATA_775420 is not set +# CONFIG_ARM_ERRATA_798181 is not set +# CONFIG_ARM_ERRATA_773022 is not set +# CONFIG_ARM_ERRATA_818325_852422 is not set +# CONFIG_ARM_ERRATA_821420 is not set +# CONFIG_ARM_ERRATA_825619 is not set +# CONFIG_ARM_ERRATA_852421 is not set +# CONFIG_ARM_ERRATA_852423 is not set + +# +# Bus support +# +# CONFIG_PCI is not set +# CONFIG_PCI_DOMAINS_GENERIC is not set +# CONFIG_PCI_SYSCALL is not set + +# +# Cadence PCIe controllers support +# + +# +# DesignWare PCI Core Support +# + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# CONFIG_PCCARD is not set + +# +# Kernel Features +# +CONFIG_HAVE_SMP=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_ARM_CPU_TOPOLOGY=y +# CONFIG_SCHED_MC is not set +# CONFIG_SCHED_SMT is not set +CONFIG_HAVE_ARM_ARCH_TIMER=y +# CONFIG_MCPM is not set +# CONFIG_BIG_LITTLE is not set +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_3G_OPT is not set +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_NR_CPUS=8 +CONFIG_HOTPLUG_CPU=y +CONFIG_ARM_PSCI=y +CONFIG_ARCH_NR_GPIO=416 +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set +CONFIG_HZ_FIXED=0 +CONFIG_HZ_100=y +# CONFIG_HZ_200 is not set +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +# CONFIG_HZ_500 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=100 +CONFIG_SCHED_HRTICK=y +# CONFIG_THUMB2_KERNEL is not set +CONFIG_ARM_PATCH_IDIV=y +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_HAVE_ARCH_PFN_VALID=y +CONFIG_HIGHMEM=y +CONFIG_HIGHPTE=y +CONFIG_CPU_SW_DOMAIN_PAN=y +CONFIG_HW_PERF_EVENTS=y +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +# CONFIG_ARM_MODULE_PLTS is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_HAVE_MEMBLOCK=y +CONFIG_NO_BOOTMEM=y +CONFIG_MEMORY_ISOLATION=y +# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_COMPACTION=y +CONFIG_MIGRATION=y +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_BOUNCE=y +# CONFIG_KSM is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 +# CONFIG_ARCH_WANTS_THP_SWAP is not set +# CONFIG_CLEANCACHE is not set +# CONFIG_FRONTSWAP is not set +CONFIG_CMA=y +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_AREAS=7 +# CONFIG_ZPOOL is not set +# CONFIG_ZBUD is not set +# CONFIG_ZSMALLOC is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_IDLE_PAGE_TRACKING is not set +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_BENCHMARK is not set +CONFIG_FORCE_MAX_ZONEORDER=11 +CONFIG_ALIGNMENT_TRAP=y +# CONFIG_UACCESS_WITH_MEMCPY is not set +# CONFIG_SECCOMP is not set +CONFIG_SWIOTLB=y +CONFIG_IOMMU_HELPER=y +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +# CONFIG_XEN is not set + +# +# Boot options +# +CONFIG_USE_OF=y +CONFIG_ATAGS=y +# CONFIG_DEPRECATED_PARAM_STRUCT is not set +CONFIG_ZBOOT_ROM_TEXT=0 +CONFIG_ZBOOT_ROM_BSS=0 +CONFIG_ARM_APPENDED_DTB=y +CONFIG_ARM_ATAG_DTB_COMPAT=y +CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y +# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set +CONFIG_CMDLINE="" +# CONFIG_KEXEC is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_AUTO_ZRELADDR=y +# CONFIG_EFI is not set + +# +# CPU Power Management +# + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +# CONFIG_CPU_FREQ_STAT is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set + +# +# CPU frequency scaling drivers +# +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set +# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set +# CONFIG_QORIQ_CPUFREQ is not set + +# +# CPU Idle +# +# CONFIG_CPU_IDLE is not set +# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_NEON=y +# CONFIG_KERNEL_MODE_NEON is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_ELF_FDPIC is not set +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +# CONFIG_BINFMT_FLAT is not set +# CONFIG_HAVE_AOUT is not set +# CONFIG_BINFMT_MISC is not set +CONFIG_COREDUMP=y + +# +# Power management options +# +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_HIBERNATION is not set +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +# CONFIG_PM_AUTOSLEEP is not set +# CONFIG_PM_WAKELOCKS is not set +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set +# CONFIG_APM_EMULATION is not set +CONFIG_PM_CLK=y +# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set +CONFIG_CPU_PM=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +# CONFIG_UNIX_DIAG is not set +# CONFIG_TLS is not set +# CONFIG_XFRM_USER is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +# CONFIG_NET_IP_TUNNEL is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_NET_UDP_TUNNEL is not set +# CONFIG_NET_FOU is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IPV6 is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NET_PTP_CLASSIFY=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +# CONFIG_BRIDGE is not set +CONFIG_HAVE_NET_DSA=y +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +# CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set +CONFIG_DNS_RESOLVER=y +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_NET_NCSI is not set +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +# CONFIG_CGROUP_NET_PRIO is not set +# CONFIG_CGROUP_NET_CLASSID is not set +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +# CONFIG_BPF_JIT is not set +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +CONFIG_CAN=y +CONFIG_CAN_RAW=y +CONFIG_CAN_BCM=y +CONFIG_CAN_GW=y + +# +# CAN Device Drivers +# +# CONFIG_CAN_VCAN is not set +# CONFIG_CAN_VXCAN is not set +# CONFIG_CAN_SLCAN is not set +CONFIG_CAN_DEV=y +CONFIG_CAN_CALC_BITTIMING=y +# CONFIG_CAN_LEDS is not set +# CONFIG_CAN_FLEXCAN is not set +# CONFIG_CAN_GRCAN is not set +CONFIG_CAN_SUN4I=y +# CONFIG_CAN_TI_HECC is not set +# CONFIG_CAN_C_CAN is not set +# CONFIG_CAN_CC770 is not set +# CONFIG_CAN_IFI_CANFD is not set +# CONFIG_CAN_M_CAN is not set +# CONFIG_CAN_RCAR is not set +# CONFIG_CAN_RCAR_CANFD is not set +# CONFIG_CAN_SJA1000 is not set +# CONFIG_CAN_SOFTING is not set + +# +# CAN SPI interfaces +# +# CONFIG_CAN_HI311X is not set +# CONFIG_CAN_MCP251X is not set + +# +# CAN USB interfaces +# +# CONFIG_CAN_EMS_USB is not set +# CONFIG_CAN_ESD_USB2 is not set +# CONFIG_CAN_GS_USB is not set +# CONFIG_CAN_KVASER_USB is not set +# CONFIG_CAN_PEAK_USB is not set +# CONFIG_CAN_8DEV_USB is not set +# CONFIG_CAN_MCBA_USB is not set +# CONFIG_CAN_DEBUG_DEVICES is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +# CONFIG_STREAM_PARSER is not set +CONFIG_WIRELESS=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_CFG80211=y +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +CONFIG_CFG80211_DEFAULT_PS=y +# CONFIG_CFG80211_DEBUGFS is not set +CONFIG_CFG80211_CRDA_SUPPORT=y +CONFIG_CFG80211_WEXT=y +# CONFIG_LIB80211 is not set +CONFIG_MAC80211=y +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_MINSTREL_HT=y +# CONFIG_MAC80211_RC_MINSTREL_VHT is not set +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_MESSAGE_TRACING is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +# CONFIG_WIMAX is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +# CONFIG_DST_CACHE is not set +# CONFIG_GRO_CELLS is not set +# CONFIG_NET_DEVLINK is not set +CONFIG_MAY_USE_DEVLINK=y +CONFIG_HAVE_EBPF_JIT=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set +CONFIG_WANT_DEV_COREDUMP=y +CONFIG_ALLOW_DEV_COREDUMP=y +CONFIG_DEV_COREDUMP=y +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_GENERIC_CPU_DEVICES is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +CONFIG_DMA_CMA=y + +# +# Default contiguous memory area size: +# +CONFIG_CMA_SIZE_MBYTES=16 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_ALIGNMENT=8 +CONFIG_GENERIC_ARCH_TOPOLOGY=y + +# +# Bus devices +# +CONFIG_ARM_CCI=y +CONFIG_ARM_CCI400_COMMON=y +# CONFIG_ARM_CCI400_PMU is not set +CONFIG_ARM_CCI400_PORT_CTRL=y +# CONFIG_ARM_CCI5xx_PMU is not set +# CONFIG_ARM_CCN is not set +# CONFIG_BRCMSTB_GISB_ARB is not set +# CONFIG_SIMPLE_PM_BUS is not set +CONFIG_SUNXI_RSB=y +# CONFIG_VEXPRESS_CONFIG is not set +# CONFIG_CONNECTOR is not set +# CONFIG_MTD is not set +CONFIG_DTC=y +CONFIG_OF=y +# CONFIG_OF_UNITTEST is not set +CONFIG_OF_FLATTREE=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_KOBJ=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_IRQ=y +CONFIG_OF_NET=y +CONFIG_OF_MDIO=y +CONFIG_OF_RESERVED_MEM=y +# CONFIG_OF_OVERLAY is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_BLK_DEV_RBD is not set + +# +# NVME Support +# +# CONFIG_NVME_FC is not set + +# +# Misc devices +# +# CONFIG_SENSORS_LIS3LV02D is not set +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_USB_SWITCH_FSA9480 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_MISC_RTSX is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set + +# +# Intel MIC & related support +# + +# +# Intel MIC Bus Driver +# + +# +# SCIF Bus Driver +# + +# +# VOP Bus Driver +# + +# +# Intel MIC Host Driver +# + +# +# Intel MIC Card Driver +# + +# +# SCIF Driver +# + +# +# Intel MIC Coprocessor State Management (COSM) Drivers +# + +# +# VOP Driver +# +# CONFIG_ECHO is not set +# CONFIG_CXL_BASE is not set +# CONFIG_CXL_AFU_DRIVER_OPS is not set +# CONFIG_CXL_LIB is not set +# CONFIG_OCXL_BASE is not set +# CONFIG_MISC_RTSX_USB is not set + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_NETLINK is not set +# CONFIG_SCSI_MQ_DEFAULT is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_DH is not set +# CONFIG_SCSI_OSD_INITIATOR is not set +CONFIG_ATA=y +# CONFIG_ATA_NONSTANDARD is not set +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +# CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_CEVA is not set +CONFIG_AHCI_SUNXI=y +# CONFIG_AHCI_QORIQ is not set +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +# CONFIG_SATA_DWC is not set + +# +# PATA SFF controllers with BMDMA +# + +# +# PIO-only SFF controllers +# + +# +# Generic fallback / legacy drivers +# +# CONFIG_MD is not set +# CONFIG_TARGET_CORE is not set +CONFIG_NETDEVICES=y +CONFIG_MII=y +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_TUN is not set +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_VETH is not set +# CONFIG_NLMON is not set + +# +# CAIF transport drivers +# + +# +# Distributed Switch Architecture drivers +# +CONFIG_ETHERNET=y +CONFIG_NET_VENDOR_ALACRITECH=y +CONFIG_NET_VENDOR_ALLWINNER=y +CONFIG_SUN4I_EMAC=y +# CONFIG_ALTERA_TSE is not set +CONFIG_NET_VENDOR_AMAZON=y +CONFIG_NET_VENDOR_AQUANTIA=y +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CIRRUS is not set +CONFIG_NET_VENDOR_CORTINA=y +# CONFIG_GEMINI_ETHERNET is not set +# CONFIG_DM9000 is not set +# CONFIG_DNET is not set +CONFIG_NET_VENDOR_EZCHIP=y +# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set +# CONFIG_NET_VENDOR_FARADAY is not set +CONFIG_NET_VENDOR_HISILICON=y +# CONFIG_HIX5HD2_GMAC is not set +# CONFIG_HISI_FEMAC is not set +# CONFIG_HIP04_ETH is not set +# CONFIG_HNS is not set +# CONFIG_HNS_DSAF is not set +# CONFIG_HNS_ENET is not set +CONFIG_NET_VENDOR_HUAWEI=y +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +CONFIG_NET_VENDOR_MELLANOX=y +# CONFIG_MLXSW_CORE is not set +# CONFIG_MLXFW is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +CONFIG_NET_VENDOR_NETRONOME=y +# CONFIG_ETHOC is not set +CONFIG_NET_VENDOR_QUALCOMM=y +# CONFIG_QCA7000_SPI is not set +# CONFIG_QCOM_EMAC is not set +# CONFIG_RMNET is not set +CONFIG_NET_VENDOR_RENESAS=y +CONFIG_NET_VENDOR_ROCKER=y +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +CONFIG_NET_VENDOR_SOLARFLARE=y +# CONFIG_NET_VENDOR_SMSC is not set +CONFIG_NET_VENDOR_SOCIONEXT=y +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_STMMAC_ETH=y +CONFIG_STMMAC_PLATFORM=y +# CONFIG_DWMAC_DWC_QOS_ETH is not set +CONFIG_DWMAC_GENERIC=y +CONFIG_DWMAC_SUNXI=y +CONFIG_DWMAC_SUN8I=y +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +CONFIG_NET_VENDOR_SYNOPSYS=y +# CONFIG_DWC_XLGMAC is not set +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_BUS=y +# CONFIG_MDIO_BCM_UNIMAC is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_MDIO_BUS_MUX=y +# CONFIG_MDIO_BUS_MUX_GPIO is not set +# CONFIG_MDIO_BUS_MUX_MMIOREG is not set +# CONFIG_MDIO_HISI_FEMAC is not set +CONFIG_MDIO_SUN4I=y +CONFIG_PHYLIB=y +CONFIG_SWPHY=y +# CONFIG_LED_TRIGGER_PHY is not set + +# +# MII PHY device drivers +# +# CONFIG_AMD_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +# CONFIG_AT803X_PHY is not set +# CONFIG_BCM7XXX_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +CONFIG_FIXED_PHY=y +# CONFIG_ICPLUS_PHY is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_MICROCHIP_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_RENESAS_PHY is not set +# CONFIG_ROCKCHIP_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_TERANETICS_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_MICREL_KS8995MA is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +CONFIG_USB_NET_DRIVERS=y +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_IPHETH is not set +CONFIG_WLAN=y +CONFIG_WLAN_VENDOR_ADMTEK=y +CONFIG_ATH_COMMON=m +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +CONFIG_ATH9K_HW=m +CONFIG_ATH9K_COMMON=m +CONFIG_ATH9K_BTCOEX_SUPPORT=y +CONFIG_ATH9K=m +# CONFIG_ATH9K_AHB is not set +# CONFIG_ATH9K_DEBUGFS is not set +# CONFIG_ATH9K_DYNACK is not set +# CONFIG_ATH9K_WOW is not set +# CONFIG_ATH9K_CHANNEL_CONTEXT is not set +CONFIG_ATH9K_PCOEM=y +CONFIG_ATH9K_HTC=m +# CONFIG_ATH9K_HTC_DEBUGFS is not set +CONFIG_CARL9170=m +CONFIG_CARL9170_LEDS=y +CONFIG_CARL9170_WPC=y +# CONFIG_ATH6KL is not set +# CONFIG_AR5523 is not set +CONFIG_ATH10K=m +# CONFIG_ATH10K_SDIO is not set +CONFIG_ATH10K_USB=m +# CONFIG_ATH10K_DEBUG is not set +# CONFIG_ATH10K_DEBUGFS is not set +# CONFIG_WCN36XX is not set +CONFIG_WLAN_VENDOR_ATMEL=y +# CONFIG_AT76C50X_USB is not set +CONFIG_WLAN_VENDOR_BROADCOM=y +CONFIG_B43=m +CONFIG_B43_BCMA=y +CONFIG_B43_SSB=y +CONFIG_B43_BUSES_BCMA_AND_SSB=y +# CONFIG_B43_BUSES_BCMA is not set +# CONFIG_B43_BUSES_SSB is not set +# CONFIG_B43_SDIO is not set +CONFIG_B43_BCMA_PIO=y +CONFIG_B43_PIO=y +CONFIG_B43_PHY_G=y +CONFIG_B43_PHY_N=y +CONFIG_B43_PHY_LP=y +CONFIG_B43_PHY_HT=y +CONFIG_B43_LEDS=y +# CONFIG_B43_DEBUG is not set +# CONFIG_B43LEGACY is not set +# CONFIG_BRCMSMAC is not set +# CONFIG_BRCMFMAC is not set +CONFIG_WLAN_VENDOR_CISCO=y +CONFIG_WLAN_VENDOR_INTEL=y +CONFIG_WLAN_VENDOR_INTERSIL=y +# CONFIG_HOSTAP is not set +# CONFIG_P54_COMMON is not set +CONFIG_WLAN_VENDOR_MARVELL=y +# CONFIG_LIBERTAS is not set +# CONFIG_LIBERTAS_THINFIRM is not set +# CONFIG_MWIFIEX is not set +CONFIG_WLAN_VENDOR_MEDIATEK=y +# CONFIG_MT7601U is not set +CONFIG_WLAN_VENDOR_RALINK=y +CONFIG_RT2X00=m +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT33XX=y +CONFIG_RT2800USB_RT35XX=y +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RT2800_LIB=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y +CONFIG_RT2X00_LIB_LEDS=y +# CONFIG_RT2X00_DEBUG is not set +CONFIG_WLAN_VENDOR_REALTEK=y +# CONFIG_RTL8187 is not set +CONFIG_RTL_CARDS=m +# CONFIG_RTL8192CU is not set +# CONFIG_RTL8XXXU is not set +CONFIG_WLAN_VENDOR_RSI=y +# CONFIG_RSI_91X is not set +CONFIG_WLAN_VENDOR_ST=y +# CONFIG_CW1200 is not set +CONFIG_WLAN_VENDOR_TI=y +# CONFIG_WL1251 is not set +# CONFIG_WL12XX is not set +# CONFIG_WL18XX is not set +# CONFIG_WLCORE is not set +CONFIG_WLAN_VENDOR_ZYDAS=y +# CONFIG_USB_ZD1201 is not set +# CONFIG_ZD1211RW is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +# CONFIG_MAC80211_HWSIM is not set +# CONFIG_USB_NET_RNDIS_WLAN is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# +# CONFIG_WAN is not set +# CONFIG_NETDEVSIM is not set +# CONFIG_ISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ADC is not set +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_KEYBOARD_GPIO_POLLED is not set +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MCS is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +CONFIG_KEYBOARD_SUN4I_LRADC=y +# CONFIG_KEYBOARD_OMAP4 is not set +# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_BCM is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_PROPERTIES=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set +# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GOODIX is not set +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +# CONFIG_TOUCHSCREEN_ELAN is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MCS5000 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set +CONFIG_TOUCHSCREEN_SUN4I=y +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_ATMEL_CAPTOUCH is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_GP2A is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +# CONFIG_INPUT_REGULATOR_HAPTIC is not set +CONFIG_INPUT_AXP20X_PEK=y +# CONFIG_INPUT_UINPUT is not set +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_PWM_BEEPER is not set +# CONFIG_INPUT_PWM_VIBRA is not set +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +# CONFIG_RMI4_CORE is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_SERPORT=y +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_SERIO_APBPS2 is not set +# CONFIG_SERIO_SUN4I_PS2 is not set +# CONFIG_SERIO_GPIO_PS2 is not set +# CONFIG_USERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_TRACE_SINK is not set +CONFIG_DEVMEM=y +# CONFIG_DEVKMEM is not set + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DMA=y +CONFIG_SERIAL_8250_NR_UARTS=8 +CONFIG_SERIAL_8250_RUNTIME_UARTS=8 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_ASPEED_VUART is not set +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_DW=y +# CONFIG_SERIAL_8250_EM is not set +# CONFIG_SERIAL_8250_RT288X is not set +CONFIG_SERIAL_OF_PLATFORM=y + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_BCM63XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_IFX6X60 is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +# CONFIG_SERIAL_ST_ASC is not set +# CONFIG_SERIAL_DEV_BUS is not set +# CONFIG_HVC_DCC is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_R3964 is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_XILLYBUS is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_CHARDEV=y +# CONFIG_I2C_MUX is not set +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_ALGOBIT=m + +# +# I2C Hardware Bus support +# + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_DESIGNWARE_PLATFORM is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +CONFIG_I2C_MV64XXX=y +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_PXA_PCI is not set +# CONFIG_I2C_RK3X is not set +# CONFIG_I2C_SIMTEC is not set +CONFIG_I2C_SUN6I_P2WI=y +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_PARPORT_LIGHT is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +CONFIG_SPI=y +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_DESIGNWARE is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PXA2XX_PCI is not set +# CONFIG_SPI_ROCKCHIP is not set +# CONFIG_SPI_SC18IS602 is not set +CONFIG_SPI_SUN4I=y +CONFIG_SPI_SUN6I=y +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_ZYNQMP_GQSPI is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +# CONFIG_PPS_CLIENT_KTIMER is not set +# CONFIG_PPS_CLIENT_LDISC is not set +# CONFIG_PPS_CLIENT_GPIO is not set + +# +# PPS generators support +# + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=y + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +CONFIG_PINCTRL=y +CONFIG_PINMUX=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_PINCTRL_AXP209 is not set +# CONFIG_PINCTRL_AMD is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_SINGLE is not set +# CONFIG_PINCTRL_SX150X is not set +CONFIG_PINCTRL_SUNXI=y +CONFIG_PINCTRL_SUN4I_A10=y +CONFIG_PINCTRL_SUN5I=y +CONFIG_PINCTRL_SUN6I_A31=y +CONFIG_PINCTRL_SUN6I_A31_R=y +CONFIG_PINCTRL_SUN8I_A23=y +CONFIG_PINCTRL_SUN8I_A33=y +CONFIG_PINCTRL_SUN8I_A83T=y +CONFIG_PINCTRL_SUN8I_A83T_R=y +CONFIG_PINCTRL_SUN8I_A23_R=y +CONFIG_PINCTRL_SUN8I_H3=y +CONFIG_PINCTRL_SUN8I_H3_R=y +CONFIG_PINCTRL_SUN8I_V3S=y +CONFIG_PINCTRL_SUN9I_A80=y +CONFIG_PINCTRL_SUN9I_A80_R=y +# CONFIG_PINCTRL_SUN50I_A64 is not set +# CONFIG_PINCTRL_SUN50I_A64_R is not set +# CONFIG_PINCTRL_SUN50I_H5 is not set +CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y +CONFIG_GPIOLIB=y +CONFIG_OF_GPIO=y +CONFIG_GPIO_SYSFS=y + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_FTGPIO010 is not set +# CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_GRGPIO is not set +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_GPIO_MPC8XXX is not set +# CONFIG_GPIO_SYSCON is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_ZEVIO is not set + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADP5588 is not set +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set + +# +# MFD GPIO expanders +# +# CONFIG_HTC_EGPIO is not set + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set + +# +# USB GPIO expanders +# +# CONFIG_W1 is not set +# CONFIG_POWER_AVS is not set +# CONFIG_POWER_RESET is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_GENERIC_ADC_BATTERY is not set +# CONFIG_TEST_POWER is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_LEGO_EV3 is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +CONFIG_CHARGER_AXP20X=y +CONFIG_BATTERY_AXP20X=y +CONFIG_AXP20X_POWER=y +# CONFIG_AXP288_FUEL_GAUGE is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_MANAGER is not set +# CONFIG_CHARGER_LTC3651 is not set +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24190 is not set +# CONFIG_CHARGER_BQ24257 is not set +# CONFIG_CHARGER_BQ24735 is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_CHARGER_RT9455 is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_AD7314 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7310 is not set +# CONFIG_SENSORS_ADT7410 is not set +# CONFIG_SENSORS_ADT7411 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_ASC7621 is not set +# CONFIG_SENSORS_ASPEED is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FTSTEUTATES is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_GPIO_FAN is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_IIO_HWMON is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX16065 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX1668 is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX31722 is not set +# CONFIG_SENSORS_MAX6621 is not set +# CONFIG_SENSORS_MAX6639 is not set +# CONFIG_SENSORS_MAX6642 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_MAX6697 is not set +# CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MCP3021 is not set +# CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM73 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# CONFIG_SENSORS_LM95245 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NCT7802 is not set +# CONFIG_SENSORS_NCT7904 is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +# CONFIG_SENSORS_PWM_FAN is not set +# CONFIG_SENSORS_SHT15 is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHTC1 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_EMC1403 is not set +# CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_SCH5627 is not set +# CONFIG_SENSORS_SCH5636 is not set +# CONFIG_SENSORS_STTS751 is not set +# CONFIG_SENSORS_SMM665 is not set +# CONFIG_SENSORS_ADC128D818 is not set +# CONFIG_SENSORS_ADS1015 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_ADS7871 is not set +# CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_INA209 is not set +# CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA3221 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +# CONFIG_THERMAL_WRITABLE_TRIPS is not set +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +# CONFIG_THERMAL_GOV_BANG_BANG is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set +CONFIG_CPU_THERMAL=y +# CONFIG_CLOCK_THERMAL is not set +# CONFIG_THERMAL_EMULATION is not set +# CONFIG_QORIQ_THERMAL is not set + +# +# ACPI INT340X thermal drivers +# +# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +# CONFIG_WATCHDOG_SYSFS is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_GPIO_WATCHDOG is not set +# CONFIG_XILINX_WATCHDOG is not set +# CONFIG_ZIIRAVE_WATCHDOG is not set +# CONFIG_CADENCE_WATCHDOG is not set +# CONFIG_FTWDT010_WATCHDOG is not set +# CONFIG_DW_WATCHDOG is not set +CONFIG_SUNXI_WATCHDOG=y +# CONFIG_MAX63XX_WATCHDOG is not set +# CONFIG_MEN_A21_WDT is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set +CONFIG_SSB_POSSIBLE=y +CONFIG_SSB=m +CONFIG_SSB_BLOCKIO=y +CONFIG_SSB_SDIOHOST_POSSIBLE=y +# CONFIG_SSB_SDIOHOST is not set +# CONFIG_SSB_DEBUG is not set +# CONFIG_SSB_DRIVER_GPIO is not set +CONFIG_BCMA_POSSIBLE=y +CONFIG_BCMA=m +CONFIG_BCMA_BLOCKIO=y +# CONFIG_BCMA_HOST_SOC is not set +# CONFIG_BCMA_DRIVER_GMAC_CMN is not set +# CONFIG_BCMA_DRIVER_GPIO is not set +# CONFIG_BCMA_DEBUG is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_AS3722 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +CONFIG_MFD_AC100=y +CONFIG_MFD_AXP20X=y +CONFIG_MFD_AXP20X_I2C=y +CONFIG_MFD_AXP20X_RSB=y +# CONFIG_MFD_CROS_EC is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_HTC_I2CPLD is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77620 is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_CPCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_PM8XXX is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_RK808 is not set +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_SMSC is not set +# CONFIG_ABX500_CORE is not set +# CONFIG_MFD_STMPE is not set +CONFIG_MFD_SUN6I_PRCM=y +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_MFD_TC6393XB is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +CONFIG_REGULATOR_FIXED_VOLTAGE=y +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set +# CONFIG_REGULATOR_ACT8865 is not set +# CONFIG_REGULATOR_AD5398 is not set +# CONFIG_REGULATOR_ANATOP is not set +CONFIG_REGULATOR_AXP20X=y +# CONFIG_REGULATOR_DA9210 is not set +# CONFIG_REGULATOR_DA9211 is not set +# CONFIG_REGULATOR_FAN53555 is not set +CONFIG_REGULATOR_GPIO=y +# CONFIG_REGULATOR_ISL9305 is not set +# CONFIG_REGULATOR_ISL6271A is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_LP3972 is not set +# CONFIG_REGULATOR_LP872X is not set +# CONFIG_REGULATOR_LP8755 is not set +# CONFIG_REGULATOR_LTC3589 is not set +# CONFIG_REGULATOR_LTC3676 is not set +# CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_MAX8649 is not set +# CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8952 is not set +# CONFIG_REGULATOR_MAX8973 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_PFUZE100 is not set +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +# CONFIG_REGULATOR_PWM is not set +# CONFIG_REGULATOR_TPS51632 is not set +# CONFIG_REGULATOR_TPS62360 is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +# CONFIG_REGULATOR_TPS65132 is not set +# CONFIG_REGULATOR_TPS6524X is not set +# CONFIG_REGULATOR_VCTRL is not set +CONFIG_CEC_CORE=m +CONFIG_CEC_PIN=y +CONFIG_RC_CORE=y +CONFIG_RC_MAP=y +# CONFIG_LIRC is not set +CONFIG_RC_DECODERS=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_SHARP_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +CONFIG_IR_XMP_DECODER=y +CONFIG_RC_DEVICES=y +# CONFIG_RC_ATI_REMOTE is not set +# CONFIG_IR_HIX5HD2 is not set +# CONFIG_IR_IMON is not set +# CONFIG_IR_MCEUSB is not set +# CONFIG_IR_REDRAT3 is not set +# CONFIG_IR_STREAMZAP is not set +# CONFIG_IR_IGORPLUGUSB is not set +# CONFIG_IR_IGUANA is not set +# CONFIG_IR_TTUSBIR is not set +# CONFIG_RC_LOOPBACK is not set +# CONFIG_IR_GPIO_CIR is not set +CONFIG_IR_SUNXI=y +# CONFIG_IR_SERIAL is not set +# CONFIG_IR_SIR is not set +CONFIG_MEDIA_SUPPORT=y + +# +# Multimedia core support +# +# CONFIG_MEDIA_CAMERA_SUPPORT is not set +# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set +# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set +# CONFIG_MEDIA_RADIO_SUPPORT is not set +# CONFIG_MEDIA_SDR_SUPPORT is not set +# CONFIG_MEDIA_CEC_SUPPORT is not set +# CONFIG_MEDIA_CEC_RC is not set +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +# CONFIG_TTPCI_EEPROM is not set + +# +# Media drivers +# +# CONFIG_MEDIA_USB_SUPPORT is not set + +# +# Supported MMC/SDIO adapters +# +# CONFIG_CYPRESS_FIRMWARE is not set + +# +# Media ancillary drivers (tuners, sensors, i2c, spi, frontends) +# + +# +# Customise DVB Frontends +# + +# +# Tools to develop new frontends +# + +# +# Graphics support +# +# CONFIG_IMX_IPUV3_CORE is not set +CONFIG_DRM=m +# CONFIG_DRM_DP_AUX_CHARDEV is not set +CONFIG_DRM_KMS_HELPER=m +CONFIG_DRM_KMS_FB_HELPER=y +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=200 +# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set +CONFIG_DRM_GEM_CMA_HELPER=y +CONFIG_DRM_KMS_CMA_HELPER=y + +# +# I2C encoder or helper chips +# +# CONFIG_DRM_I2C_CH7006 is not set +# CONFIG_DRM_I2C_SIL164 is not set +# CONFIG_DRM_I2C_NXP_TDA998X is not set +CONFIG_DRM_ARM=y +# CONFIG_DRM_HDLCD is not set +CONFIG_DRM_MALI_DISPLAY=m + +# +# ACP (Audio CoProcessor) Configuration +# + +# +# AMD Library routines +# +# CONFIG_CHASH is not set +# CONFIG_DRM_VGEM is not set +# CONFIG_DRM_EXYNOS is not set +# CONFIG_DRM_UDL is not set +# CONFIG_DRM_ARMADA is not set +# CONFIG_DRM_RCAR_DW_HDMI is not set +CONFIG_DRM_SUN4I=m +CONFIG_DRM_SUN4I_HDMI=m +CONFIG_DRM_SUN4I_HDMI_CEC=y +CONFIG_DRM_SUN4I_BACKEND=m +CONFIG_DRM_SUN8I_DW_HDMI=m +CONFIG_DRM_SUN8I_MIXER=m +# CONFIG_DRM_OMAP is not set +# CONFIG_DRM_TILCDC is not set +# CONFIG_DRM_FSL_DCU is not set +# CONFIG_DRM_STM is not set +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +# CONFIG_DRM_PANEL_ARM_VERSATILE is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +# CONFIG_DRM_PANEL_LG_LG4573 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +CONFIG_DRM_DUMB_VGA_DAC=m +# CONFIG_DRM_LVDS_ENCODER is not set +# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set +# CONFIG_DRM_NXP_PTN3460 is not set +# CONFIG_DRM_PARADE_PS8622 is not set +# CONFIG_DRM_SIL_SII8620 is not set +# CONFIG_DRM_SII902X is not set +# CONFIG_DRM_SII9234 is not set +# CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_I2C_ADV7511 is not set +CONFIG_DRM_DW_HDMI=m +# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set +# CONFIG_DRM_DW_HDMI_I2S_AUDIO is not set +# CONFIG_DRM_DW_HDMI_CEC is not set +# CONFIG_DRM_STI is not set +# CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_MXSFB is not set +# CONFIG_DRM_TINYDRM is not set +# CONFIG_DRM_PL111 is not set +# CONFIG_DRM_TVE200 is not set +# CONFIG_DRM_LEGACY is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=m +# CONFIG_DRM_LIB_RANDOM is not set + +# +# Frame buffer Devices +# +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +# CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +CONFIG_FB_SYS_FILLRECT=m +CONFIG_FB_SYS_COPYAREA=m +CONFIG_FB_SYS_IMAGEBLIT=m +# CONFIG_FB_PROVIDE_GET_FB_UNMAPPED_AREA is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=m +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_BROADSHEET is not set +# CONFIG_FB_AUO_K190X is not set +CONFIG_FB_SIMPLE=y +# CONFIG_FB_SSD1307 is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_VGASTATE is not set +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +# CONFIG_LOGO is not set +CONFIG_SOUND=y +# CONFIG_SOUND_OSS_CORE is not set +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_DMAENGINE_PCM=y +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +# CONFIG_SND_OSSEMUL is not set +CONFIG_SND_PCM_TIMER=y +# CONFIG_SND_HRTIMER is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_SEQUENCER is not set +# CONFIG_SND_OPL3_LIB_SEQ is not set +# CONFIG_SND_OPL4_LIB_SEQ is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_ALOOP is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# HD-Audio +# +CONFIG_SND_HDA_PREALLOC_SIZE=64 +CONFIG_SND_ARM=y +CONFIG_SND_SPI=y +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_USB_HIFACE is not set +# CONFIG_SND_BCD2000 is not set +# CONFIG_SND_USB_POD is not set +# CONFIG_SND_USB_PODHD is not set +# CONFIG_SND_USB_TONEPORT is not set +# CONFIG_SND_USB_VARIAX is not set +CONFIG_SND_SOC=y +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_ATMEL_SOC is not set +# CONFIG_SND_DESIGNWARE_I2S is not set + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_SAI is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# CONFIG_SND_I2S_HI6210_I2S is not set +# CONFIG_SND_SOC_IMG is not set + +# +# STMicroelectronics STM32 SOC audio support +# + +# +# Allwinner SoC Audio support +# +CONFIG_SND_SUN4I_CODEC=y +# CONFIG_SND_SUN8I_CODEC is not set +# CONFIG_SND_SUN8I_CODEC_ANALOG is not set +# CONFIG_SND_SUN4I_I2S is not set +# CONFIG_SND_SUN4I_SPDIF is not set +# CONFIG_SND_SOC_XTFPGA_I2S is not set +# CONFIG_ZX_TDM is not set +CONFIG_SND_SOC_I2C_AND_SPI=y + +# +# CODEC drivers +# +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_BT_SCO is not set +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +# CONFIG_SND_SOC_DIO2125 is not set +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES8316 is not set +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_INNO_RK3036 is not set +# CONFIG_SND_SOC_MAX98504 is not set +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MAX98373 is not set +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_RT5514_SPI_BUILTIN is not set +# CONFIG_SND_SOC_RT5616 is not set +# CONFIG_SND_SOC_RT5631 is not set +# CONFIG_SND_SOC_RT5677_SPI is not set +# CONFIG_SND_SOC_SGTL5000 is not set +# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set +# CONFIG_SND_SOC_SPDIF is not set +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TAS6424 is not set +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X is not set +# CONFIG_SND_SOC_TS3A227E is not set +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731 is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_ZX_AUD96P22 is not set +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# CONFIG_SND_SIMPLE_CARD is not set +# CONFIG_SND_SIMPLE_SCU_CARD is not set +# CONFIG_SND_AUDIO_GRAPH_CARD is not set +# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set + +# +# HID support +# +CONFIG_HID=y +# CONFIG_HID_BATTERY_STRENGTH is not set +# CONFIG_HIDRAW is not set +# CONFIG_UHID is not set +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=y +# CONFIG_HID_ACCUTOUCH is not set +# CONFIG_HID_ACRUX is not set +CONFIG_HID_APPLE=y +# CONFIG_HID_APPLEIR is not set +# CONFIG_HID_ASUS is not set +# CONFIG_HID_AUREAL is not set +CONFIG_HID_BELKIN=y +# CONFIG_HID_BETOP_FF is not set +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +# CONFIG_HID_CORSAIR is not set +# CONFIG_HID_PRODIKEYS is not set +# CONFIG_HID_CMEDIA is not set +CONFIG_HID_CYPRESS=y +# CONFIG_HID_DRAGONRISE is not set +# CONFIG_HID_EMS_FF is not set +# CONFIG_HID_ELECOM is not set +# CONFIG_HID_ELO is not set +CONFIG_HID_EZKEY=y +# CONFIG_HID_GEMBIRD is not set +# CONFIG_HID_GFRM is not set +# CONFIG_HID_HOLTEK is not set +# CONFIG_HID_GT683R is not set +# CONFIG_HID_KEYTOUCH is not set +# CONFIG_HID_KYE is not set +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_WALTOP is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_ICADE is not set +CONFIG_HID_ITE=y +# CONFIG_HID_JABRA is not set +# CONFIG_HID_TWINHAN is not set +CONFIG_HID_KENSINGTON=y +# CONFIG_HID_LCPOWER is not set +# CONFIG_HID_LED is not set +# CONFIG_HID_LENOVO is not set +CONFIG_HID_LOGITECH=y +# CONFIG_HID_LOGITECH_HIDPP is not set +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +# CONFIG_LOGIG940_FF is not set +# CONFIG_LOGIWHEELS_FF is not set +# CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MAYFLASH is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +# CONFIG_HID_MULTITOUCH is not set +# CONFIG_HID_NTI is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_ORTEK is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PENMOUNT is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PRIMAX is not set +# CONFIG_HID_RETRODE is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_SAITEK is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SONY is not set +# CONFIG_HID_SPEEDLINK is not set +# CONFIG_HID_STEELSERIES is not set +# CONFIG_HID_SUNPLUS is not set +# CONFIG_HID_RMI is not set +# CONFIG_HID_GREENASIA is not set +# CONFIG_HID_SMARTJOYPLUS is not set +# CONFIG_HID_TIVO is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_HID_THINGM is not set +# CONFIG_HID_THRUSTMASTER is not set +# CONFIG_HID_UDRAW_PS3 is not set +# CONFIG_HID_WACOM is not set +# CONFIG_HID_WIIMOTE is not set +# CONFIG_HID_XINMO is not set +# CONFIG_HID_ZEROPLUS is not set +# CONFIG_HID_ZYDACRON is not set +# CONFIG_HID_SENSOR_HUB is not set +# CONFIG_HID_ALPS is not set + +# +# USB HID support +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# I2C HID support +# +# CONFIG_I2C_HID is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +# CONFIG_USB_MON is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_XHCI_HCD is not set +CONFIG_USB_EHCI_HCD=y +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1362_HCD is not set +# CONFIG_USB_FOTG210_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_BCMA is not set +# CONFIG_USB_HCD_SSB is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +# CONFIG_USB_STORAGE is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USBIP_CORE is not set +CONFIG_USB_MUSB_HDRC=y +# CONFIG_USB_MUSB_HOST is not set +# CONFIG_USB_MUSB_GADGET is not set +CONFIG_USB_MUSB_DUAL_ROLE=y + +# +# Platform Glue Layer +# +CONFIG_USB_MUSB_SUNXI=y + +# +# MUSB DMA mode +# +# CONFIG_MUSB_PIO_ONLY is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set + +# +# USB Physical Layer drivers +# +CONFIG_USB_PHY=y +CONFIG_NOP_USB_XCEIV=y +# CONFIG_AM335X_PHY_USB is not set +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_ULPI is not set +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 + +# +# USB Peripheral Controller +# +# CONFIG_USB_FUSB300 is not set +# CONFIG_USB_FOTG210_UDC is not set +# CONFIG_USB_GR_UDC is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_SNP_UDC_PLAT is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_BDC_UDC is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_GADGET_XILINX is not set +# CONFIG_USB_DUMMY_HCD is not set +# CONFIG_USB_CONFIGFS is not set +# CONFIG_TYPEC is not set +# CONFIG_USB_LED_TRIG is not set +# CONFIG_USB_ULPI_BUS is not set +# CONFIG_UWB is not set +CONFIG_MMC=y +CONFIG_PWRSEQ_EMMC=y +CONFIG_PWRSEQ_SIMPLE=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=8 +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_SPI is not set +# CONFIG_MMC_DW is not set +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_USDHI6ROL0 is not set +CONFIG_MMC_SUNXI=y +# CONFIG_MMC_CQHCI is not set +# CONFIG_MMC_MTK is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +# CONFIG_LEDS_CLASS_FLASH is not set +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +# CONFIG_LEDS_BCM6328 is not set +# CONFIG_LEDS_BCM6358 is not set +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_LM3692X is not set +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP5521 is not set +# CONFIG_LEDS_LP5523 is not set +# CONFIG_LEDS_LP5562 is not set +# CONFIG_LEDS_LP8501 is not set +# CONFIG_LEDS_LP8860 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA963X is not set +# CONFIG_LEDS_DAC124S085 is not set +# CONFIG_LEDS_PWM is not set +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_TLC591XX is not set +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_IS31FL319X is not set +# CONFIG_LEDS_IS31FL32XX is not set + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +# CONFIG_LEDS_BLINKM is not set +# CONFIG_LEDS_SYSCON is not set +# CONFIG_LEDS_USER is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +# CONFIG_LEDS_TRIGGER_TIMER is not set +# CONFIG_LEDS_TRIGGER_ONESHOT is not set +# CONFIG_LEDS_TRIGGER_DISK is not set +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_CPU is not set +# CONFIG_LEDS_TRIGGER_ACTIVITY is not set +# CONFIG_LEDS_TRIGGER_GPIO is not set +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y + +# +# iptables trigger is under Netfilter config (LED target) +# +# CONFIG_LEDS_TRIGGER_TRANSIENT is not set +# CONFIG_LEDS_TRIGGER_CAMERA is not set +# CONFIG_LEDS_TRIGGER_PANIC is not set +# CONFIG_LEDS_TRIGGER_NETDEV is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +# CONFIG_RTC_INTF_SYSFS is not set +# CONFIG_RTC_INTF_PROC is not set +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABX80X is not set +CONFIG_RTC_DRV_AC100=y +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_HYM8563 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV8803 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RX6110 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_MCP795 is not set +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set +# CONFIG_RTC_DRV_ZYNQMP is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_SUN6I=y +CONFIG_RTC_DRV_SUNXI=y +# CONFIG_RTC_DRV_FTRTC010 is not set +# CONFIG_RTC_DRV_SNVS is not set +# CONFIG_RTC_DRV_R7301 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DMA_OF=y +# CONFIG_ALTERA_MSGDMA is not set +CONFIG_DMA_SUN4I=y +CONFIG_DMA_SUN6I=y +# CONFIG_FSL_EDMA is not set +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_NBPFAXI_DMA is not set +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +# CONFIG_DW_DMAC is not set + +# +# DMA Clients +# +# CONFIG_ASYNC_TX_DMA is not set +# CONFIG_DMATEST is not set + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +# CONFIG_AUXDISPLAY is not set +# CONFIG_UIO is not set +# CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_MENU=y +# CONFIG_VIRTIO_MMIO is not set + +# +# Microsoft Hyper-V guest support +# +# CONFIG_HYPERV_TSCPAGE is not set +# CONFIG_STAGING is not set +# CONFIG_GOLDFISH is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_CLKDEV_LOOKUP=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Common Clock Framework +# +# CONFIG_CLK_HSDK is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI514 is not set +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_CLK_QORIQ is not set +# CONFIG_COMMON_CLK_NXP is not set +# CONFIG_COMMON_CLK_PWM is not set +# CONFIG_COMMON_CLK_PXA is not set +# CONFIG_COMMON_CLK_PIC32 is not set +# CONFIG_COMMON_CLK_VC5 is not set +CONFIG_SUNXI_CCU=y +CONFIG_SUN4I_A10_CCU=y +CONFIG_SUN5I_CCU=y +CONFIG_SUN6I_A31_CCU=y +CONFIG_SUN8I_A23_CCU=y +CONFIG_SUN8I_A33_CCU=y +CONFIG_SUN8I_A83T_CCU=y +CONFIG_SUN8I_H3_CCU=y +CONFIG_SUN8I_V3S_CCU=y +CONFIG_SUN8I_DE2_CCU=y +CONFIG_SUN8I_R40_CCU=y +CONFIG_SUN9I_A80_CCU=y +CONFIG_SUN8I_R_CCU=y +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_CLKSRC_MMIO=y +CONFIG_SUN4I_TIMER=y +CONFIG_SUN5I_HSTIMER=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +# CONFIG_ARM_TIMER_SP804 is not set +# CONFIG_ATMEL_PIT is not set +# CONFIG_SH_TIMER_CMT is not set +# CONFIG_SH_TIMER_MTU2 is not set +# CONFIG_SH_TIMER_TMU is not set +# CONFIG_EM_TIMER_STI is not set +# CONFIG_MAILBOX is not set +# CONFIG_IOMMU_SUPPORT is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_VIRTIO is not set +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# + +# +# Broadcom SoC drivers +# +# CONFIG_SOC_BRCMSTB is not set + +# +# i.MX SoC drivers +# + +# +# Qualcomm SoC drivers +# +CONFIG_SUNXI_SRAM=y +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# CONFIG_XILINX_VCU is not set +# CONFIG_PM_DEVFREQ is not set +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +# CONFIG_EXTCON_ADC_JACK is not set +# CONFIG_EXTCON_AXP288 is not set +# CONFIG_EXTCON_GPIO is not set +# CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_RT8973A is not set +# CONFIG_EXTCON_SM5502 is not set +# CONFIG_EXTCON_USB_GPIO is not set +# CONFIG_MEMORY is not set +CONFIG_IIO=y +# CONFIG_IIO_BUFFER is not set +# CONFIG_IIO_CONFIGFS is not set +# CONFIG_IIO_TRIGGER is not set +# CONFIG_IIO_SW_DEVICE is not set +# CONFIG_IIO_SW_TRIGGER is not set + +# +# Accelerometers +# +# CONFIG_ADXL345_I2C is not set +# CONFIG_ADXL345_SPI is not set +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD06 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set +# CONFIG_IIO_ST_ACCEL_3AXIS is not set +# CONFIG_KXSD9 is not set +# CONFIG_KXCJK1013 is not set +# CONFIG_MC3230 is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_SCA3000 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set + +# +# Analog to digital converters +# +# CONFIG_AD7266 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD799X is not set +CONFIG_AXP20X_ADC=y +# CONFIG_AXP288_ADC is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_ENVELOPE_DETECTOR is not set +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_NAU7802 is not set +# CONFIG_SD_ADC_MODULATOR is not set +# CONFIG_SUN4I_GPADC is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_ADS8688 is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_VF610_ADC is not set + +# +# Amplifiers +# +# CONFIG_AD8366 is not set + +# +# Chemical Sensors +# +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_CCS811 is not set +# CONFIG_IAQCORE is not set +# CONFIG_VZ89X is not set + +# +# Hid Sensor IIO Common +# + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set + +# +# Counters +# + +# +# Digital to analog converters +# +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_LTC2632 is not set +# CONFIG_AD5686 is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8801 is not set +# CONFIG_DPOT_DAC is not set +# CONFIG_DS4424 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MAX5821 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set +# CONFIG_VF610_DAC is not set + +# +# IIO dummy driver +# + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS450 is not set +# CONFIG_BMG160 is not set +# CONFIG_MPU3050_I2C is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_ITG3200 is not set + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_HDC100X is not set +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16480 is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +# CONFIG_KMX61 is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_IIO_ST_LSM6DSX is not set + +# +# Light sensors +# +# CONFIG_ADJD_S311 is not set +# CONFIG_AL3320A is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9960 is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +# CONFIG_CM3605 is not set +# CONFIG_CM36651 is not set +# CONFIG_GP2AP020A00F is not set +# CONFIG_SENSORS_ISL29018 is not set +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +# CONFIG_JSA1212 is not set +# CONFIG_RPR0521 is not set +# CONFIG_LTR501 is not set +# CONFIG_MAX44000 is not set +# CONFIG_OPT3001 is not set +# CONFIG_PA12203001 is not set +# CONFIG_SI1145 is not set +# CONFIG_STK3310 is not set +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +# CONFIG_SENSORS_TSL2563 is not set +# CONFIG_TSL2583 is not set +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set + +# +# Magnetometer sensors +# +# CONFIG_AK8974 is not set +# CONFIG_AK8975 is not set +# CONFIG_AK09911 is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +# CONFIG_MMC35240 is not set +# CONFIG_IIO_ST_MAGN_3AXIS is not set +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set + +# +# Multiplexers +# +# CONFIG_IIO_MUX is not set + +# +# Inclinometer sensors +# + +# +# Digital potentiometers +# +# CONFIG_AD5272 is not set +# CONFIG_DS1803 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_TPL0102 is not set + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +# CONFIG_BMP280 is not set +# CONFIG_HP03 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +# CONFIG_ZPA2326 is not set + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set + +# +# Proximity and distance sensors +# +# CONFIG_LIDAR_LITE_V2 is not set +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set + +# +# Temperature sensors +# +# CONFIG_MAXIM_THERMOCOUPLE is not set +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +CONFIG_PWM=y +CONFIG_PWM_SYSFS=y +# CONFIG_PWM_FSL_FTM is not set +# CONFIG_PWM_PCA9685 is not set +CONFIG_PWM_SUN4I=y + +# +# IRQ chip support +# +CONFIG_IRQCHIP=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_MAX_NR=1 +# CONFIG_ARM_GIC_V3_ITS is not set +# CONFIG_IPACK_BUS is not set +CONFIG_ARCH_HAS_RESET_CONTROLLER=y +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_ATH79 is not set +# CONFIG_RESET_AXS10X is not set +# CONFIG_RESET_BERLIN is not set +# CONFIG_RESET_IMX7 is not set +# CONFIG_RESET_LANTIQ is not set +# CONFIG_RESET_LPC18XX is not set +# CONFIG_RESET_MESON is not set +# CONFIG_RESET_PISTACHIO is not set +CONFIG_RESET_SIMPLE=y +CONFIG_RESET_SUNXI=y +# CONFIG_RESET_TI_SYSCON is not set +# CONFIG_RESET_ZYNQ is not set +# CONFIG_RESET_TEGRA_BPMP is not set +# CONFIG_FMC is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +CONFIG_PHY_SUN4I_USB=y +CONFIG_PHY_SUN9I_USB=y +# CONFIG_BCM_KONA_USB2_PHY is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_CPCAP_USB is not set +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +CONFIG_ARM_PMU=y +# CONFIG_RAS is not set + +# +# Android +# +# CONFIG_ANDROID is not set +# CONFIG_DAX is not set +CONFIG_NVMEM=y +CONFIG_NVMEM_SUNXI_SID=y +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# CONFIG_FPGA is not set +# CONFIG_FSI is not set +# CONFIG_TEE is not set +CONFIG_PM_OPP=y +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set + +# +# Firmware Drivers +# +CONFIG_ARM_PSCI_FW=y +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_HAVE_ARM_SMCCC=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# Tegra firmware driver +# + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_FS_IOMAP=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_USE_FOR_EXT2=y +# CONFIG_EXT4_FS_POSIX_ACL is not set +# CONFIG_EXT4_FS_SECURITY is not set +# CONFIG_EXT4_ENCRYPTION is not set +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_F2FS_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +CONFIG_MANDATORY_FILE_LOCKING=y +# CONFIG_FS_ENCRYPTION is not set +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_FANOTIFY is not set +# CONFIG_QUOTA is not set +# CONFIG_QUOTACTL is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set +# CONFIG_OVERLAY_FS is not set + +# +# Caches +# +# CONFIG_FSCACHE is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +# CONFIG_PROC_CHILDREN is not set +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_TMPFS_XATTR is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_ECRYPT_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_PSTORE is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V2=y +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +# CONFIG_NFS_SWAP is not set +# CONFIG_NFS_V4_1 is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFS_USE_LEGACY_DNS is not set +CONFIG_NFS_USE_KERNEL_DNS=y +# CONFIG_NFSD is not set +CONFIG_GRACE_PERIOD=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_ACL_SUPPORT=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=y +# CONFIG_SUNRPC_DEBUG is not set +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +# CONFIG_NLS_UTF8 is not set + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_DYNAMIC_DEBUG is not set + +# +# Compile-time checks and compiler options +# +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_DEBUG_KERNEL is not set + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_RODATA_TEST is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +CONFIG_DEBUG_MEMORY_INIT=y + +# +# Debug Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +# CONFIG_SCHED_INFO is not set +# CONFIG_DEBUG_TIMEKEEPING is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_STACKTRACE is not set +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +CONFIG_DEBUG_BUGVERBOSE=y + +# +# RCU Debugging +# +# CONFIG_PROVE_RCU is not set +# CONFIG_TORTURE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACING_SUPPORT=y +# CONFIG_FTRACE is not set +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +# CONFIG_MEMTEST is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_ARCH_WANTS_UBSAN_NO_NULL is not set +# CONFIG_UBSAN is not set +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +# CONFIG_STRICT_DEVMEM is not set +# CONFIG_ARM_PTDUMP_CORE is not set +# CONFIG_DEBUG_WX is not set +CONFIG_ARM_UNWIND=y +# CONFIG_DEBUG_USER is not set +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +# CONFIG_DEBUG_UART_8250 is not set +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_CORESIGHT is not set + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_BIG_KEYS is not set +# CONFIG_ENCRYPTED_KEYS is not set +# CONFIG_KEY_DH_OPERATIONS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +# CONFIG_HARDENED_USERCOPY is not set +# CONFIG_STATIC_USERMODEHELPER is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_DEFAULT_SECURITY="" +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_RSA=y +# CONFIG_CRYPTO_DH is not set +# CONFIG_CRYPTO_ECDH is not set +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_USER is not set +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +# CONFIG_CRYPTO_PCRYPT is not set +CONFIG_CRYPTO_WORKQUEUE=y +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_MCRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_GCM=y +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_ECHAINIV=m + +# +# Block modes +# +# CONFIG_CRYPTO_CBC is not set +CONFIG_CRYPTO_CTR=y +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set +# CONFIG_CRYPTO_KEYWRAP is not set + +# +# Hash modes +# +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_VMAC is not set + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +CONFIG_CRYPTO_GHASH=y +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +# CONFIG_CRYPTO_SHA512 is not set +# CONFIG_CRYPTO_SHA3 is not set +# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_ARC4=y +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_CHACHA20 is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +# CONFIG_CRYPTO_DRBG_HASH is not set +# CONFIG_CRYPTO_DRBG_CTR is not set +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y +# CONFIG_CRYPTO_USER_API_HASH is not set +# CONFIG_CRYPTO_USER_API_SKCIPHER is not set +# CONFIG_CRYPTO_USER_API_RNG is not set +# CONFIG_CRYPTO_USER_API_AEAD is not set +CONFIG_CRYPTO_HASH_INFO=y +CONFIG_CRYPTO_HW=y +# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set +CONFIG_CRYPTO_DEV_SUN4I_SS=y +# CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# CONFIG_ARM_CRYPTO is not set +# CONFIG_BINARY_PRINTF is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_HAVE_ARCH_BITREVERSE=y +CONFIG_RATIONAL=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_CRC_CCITT=m +CONFIG_CRC16=y +# CONFIG_CRC_T10DIF is not set +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +# CONFIG_CRC4 is not set +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +# CONFIG_CRC8 is not set +# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_SGL_ALLOC=y +# CONFIG_DMA_DIRECT_OPS is not set +# CONFIG_DMA_VIRT_OPS is not set +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_CLZ_TAB=y +# CONFIG_CORDIC is not set +# CONFIG_DDR is not set +# CONFIG_IRQ_POLL is not set +CONFIG_MPILIB=y +CONFIG_LIBFDT=y +CONFIG_OID_REGISTRY=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +# CONFIG_SG_SPLIT is not set +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_SG_CHAIN=y +CONFIG_SBITMAP=y +# CONFIG_STRING_SELFTEST is not set +# CONFIG_VIRTUALIZATION is not set -- cgit v1.2.3 From 2a5a0bde0fa45f86b1fcfbfd50bb779f25337573 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 1 Apr 2018 07:28:22 -0600 Subject: Fixed warnings about inline static functions being exported --- redist/minimal_opencv.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/redist/minimal_opencv.c b/redist/minimal_opencv.c index 371d6f8..988dd0f 100644 --- a/redist/minimal_opencv.c +++ b/redist/minimal_opencv.c @@ -10,11 +10,10 @@ #include #include - #ifdef _WIN32 #define SURVIVE_LOCAL_ONLY #else -#define SURVIVE_LOCAL_ONLY __attribute__ ((visibility ("hidden"))) +#define SURVIVE_LOCAL_ONLY __attribute__((visibility("hidden"))) #endif SURVIVE_LOCAL_ONLY int cvRound(float f) { return roundf(f); } @@ -29,10 +28,11 @@ SURVIVE_LOCAL_ONLY void cvCopyTo(const CvMat *srcarr, CvMat *dstarr) { memcpy(dstarr->data.db, srcarr->data.db, sizeof(double) * dstarr->rows * dstarr->cols); } -SURVIVE_LOCAL_ONLY void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src3, double beta, CvMat *dst, int tABC) { +SURVIVE_LOCAL_ONLY void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src3, double beta, + CvMat *dst, int tABC) { lapack_int rows1 = src1->rows; lapack_int cols1 = src1->cols; - + lapack_int rows2 = src2->rows; lapack_int cols2 = src2->cols; @@ -74,7 +74,7 @@ SURVIVE_LOCAL_ONLY void cvMulTransposed(const CvMat *src, CvMat *dst, int order, SURVIVE_LOCAL_ONLY void *cvAlloc(size_t size) { return malloc(size); } -SURVIVE_LOCAL_ONLY static void icvCheckHuge(CvMat *arr) { +static void icvCheckHuge(CvMat *arr) { if ((int64_t)arr->step * arr->rows > INT_MAX) arr->type &= ~CV_MAT_CONT_FLAG; } @@ -111,12 +111,12 @@ SURVIVE_LOCAL_ONLY CvMat *cvCreateMatHeader(int rows, int cols, int type) { #define CV_DbgAssert assert -SURVIVE_LOCAL_ONLY static inline void *cvAlignPtr(const void *ptr, int align) { +static inline void *cvAlignPtr(const void *ptr, int align) { CV_DbgAssert((align & (align - 1)) == 0); return (void *)(((size_t)ptr + align - 1) & ~(size_t)(align - 1)); } -SURVIVE_LOCAL_ONLY static inline int cvAlign(int size, int align) { +static inline int cvAlign(int size, int align) { CV_DbgAssert((align & (align - 1)) == 0 && size < INT_MAX); return (size + align - 1) & -align; } -- cgit v1.2.3 From 558429f4d01462edb606fe51d592e9f9e3889425 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 1 Apr 2018 07:29:19 -0600 Subject: Added distance function to linmath --- redist/linmath.c | 5 +++++ redist/linmath.h | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/redist/linmath.c b/redist/linmath.c index c57410f..01ae2b0 100644 --- a/redist/linmath.c +++ b/redist/linmath.c @@ -63,6 +63,11 @@ void copy3d(FLT *out, const FLT *in) { } FLT magnitude3d(const FLT *a) { return FLT_SQRT(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); } +FLT dist3d(const FLT *a, const FLT *b) { + LinmathPoint3d tmp; + sub3d(tmp, a, b); + return magnitude3d(tmp); +} FLT anglebetween3d(FLT *a, FLT *b) { FLT an[3]; diff --git a/redist/linmath.h b/redist/linmath.h index 71fd9b0..76e1322 100644 --- a/redist/linmath.h +++ b/redist/linmath.h @@ -6,7 +6,7 @@ #ifdef __cplusplus extern "C" { #endif - + // Yes, I know it's kind of arbitrary. #define DEFAULT_EPSILON 0.001 @@ -82,7 +82,7 @@ int compare3d(const FLT *a, const FLT *b, FLT epsilon); void copy3d(FLT *out, const FLT *in); FLT magnitude3d(const FLT *a); - +FLT dist3d(const FLT *a, const FLT *b); FLT anglebetween3d(FLT *a, FLT *b); void rotatearoundaxis(FLT *outvec3, FLT *invec3, FLT *axis, FLT angle); -- cgit v1.2.3 From 22d40fb360fdb65da7916fb87f9b199f4f401f05 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 1 Apr 2018 07:52:00 -0600 Subject: overhal to calibration --- include/libsurvive/survive.h | 308 ++++++++++++++------------- include/libsurvive/survive_reproject.h | 35 +-- src/poser_epnp.c | 10 +- src/poser_sba.c | 30 ++- src/survive.c | 2 + src/survive_cal.c | 26 +-- src/survive_config.c | 22 +- src/survive_process.c | 9 +- src/survive_reproject.c | 129 ++++++++--- src/survive_sensor_activations.c | 3 +- tools/findoptimalconfig/Makefile | 3 +- tools/findoptimalconfig/findoptimalconfig.cc | 160 ++++++++++++-- 12 files changed, 496 insertions(+), 241 deletions(-) diff --git a/include/libsurvive/survive.h b/include/libsurvive/survive.h index ed43ddc..e435752 100644 --- a/include/libsurvive/survive.h +++ b/include/libsurvive/survive.h @@ -10,11 +10,10 @@ extern "C" { #endif - #ifdef _WIN32 #define SURVIVE_EXPORT __declspec(dllexport) #else -#define SURVIVE_EXPORT +#define SURVIVE_EXPORT __attribute__((visibility("default"))) #endif /** @@ -32,6 +31,7 @@ typedef struct { struct PoserDataLight; struct PoserDataIMU; + /** * Adds a lightData packet to the table. */ @@ -53,69 +53,68 @@ bool SurviveSensorActivations_isPairValid(const SurviveSensorActivations *self, */ extern uint32_t SurviveSensorActivations_default_tolerance; -//DANGER: This structure may be redefined. Note that it is logically split into 64-bit chunks -//for optimization on 32- and 64-bit systems. +// DANGER: This structure may be redefined. Note that it is logically split into 64-bit chunks +// for optimization on 32- and 64-bit systems. -struct SurviveObject -{ - SurviveContext * ctx; +struct SurviveObject { + SurviveContext *ctx; - char codename[4]; //3 letters, null-terminated. Currently HMD, WM0, WM1. - char drivername[4]; //3 letters for driver. Currently "HTC" - void *driver; + char codename[4]; // 3 letters, null-terminated. Currently HMD, WM0, WM1. + char drivername[4]; // 3 letters for driver. Currently "HTC" + void *driver; int32_t buttonmask; int16_t axis1; int16_t axis2; int16_t axis3; - int8_t charge; - int8_t charging:1; - int8_t ison:1; - int8_t additional_flags:6; - - //Pose Information, also "poser" field. - FLT PoseConfidence; //0..1 - SurvivePose OutPose; //Final pose? (some day, one can dream!) - SurvivePose FromLHPose[NUM_LIGHTHOUSES]; //Filled out by poser, contains computed position from each lighthouse. - void * PoserData; //Initialized to zero, configured by poser, can be anything the poser wants. + int8_t charge; + int8_t charging : 1; + int8_t ison : 1; + int8_t additional_flags : 6; + + // Pose Information, also "poser" field. + FLT PoseConfidence; // 0..1 + SurvivePose OutPose; // Final pose? (some day, one can dream!) + SurvivePose FromLHPose[NUM_LIGHTHOUSES]; // Filled out by poser, contains computed position from each lighthouse. + void *PoserData; // Initialized to zero, configured by poser, can be anything the poser wants. PoserCB PoserFn; - //Device-specific information about the location of the sensors. This data will be used by the poser. - int8_t sensor_ct; // sensor count - FLT * sensor_locations; // size is sensor_ct*3. Contains x,y,z values for each sensor - FLT * sensor_normals;// size is nrlocations*3. cointains normal vector for each sensor - - //Timing sensitive data (mostly for disambiguation) - int32_t timebase_hz; //48,000,000 for normal vive hardware. (checked) - int32_t timecenter_ticks; //200,000 for normal vive hardware. (checked) (This doubles-up as 2x this = full sweep length) - int32_t pulsedist_max_ticks; //500,000 for normal vive hardware. (guessed) - int32_t pulselength_min_sync; //2,200 for normal vive hardware. (guessed) - int32_t pulse_in_clear_time; //35,000 for normal vive hardware. (guessed) - int32_t pulse_max_for_sweep; //1,800 for normal vive hardware. (guessed) - int32_t pulse_synctime_offset; //20,000 for normal vive hardware. (guessed) - int32_t pulse_synctime_slack; //5,000 for normal vive hardware. (guessed) - - //Flood info, for calculating which laser is currently sweeping. - void * disambiguator_data; - int8_t oldcode; - int8_t sync_set_number; //0 = master, 1 = slave, -1 = fault. - int8_t did_handle_ootx; //If unset, will send lightcap data for sync pulses next time a sensor is hit. + // Device-specific information about the location of the sensors. This data will be used by the poser. + int8_t sensor_ct; // sensor count + FLT *sensor_locations; // size is sensor_ct*3. Contains x,y,z values for each sensor + FLT *sensor_normals; // size is nrlocations*3. cointains normal vector for each sensor + + // Timing sensitive data (mostly for disambiguation) + int32_t timebase_hz; // 48,000,000 for normal vive hardware. (checked) + int32_t timecenter_ticks; // 200,000 for normal vive hardware. (checked) (This doubles-up as 2x this = full + // sweep length) + int32_t pulsedist_max_ticks; // 500,000 for normal vive hardware. (guessed) + int32_t pulselength_min_sync; // 2,200 for normal vive hardware. (guessed) + int32_t pulse_in_clear_time; // 35,000 for normal vive hardware. (guessed) + int32_t pulse_max_for_sweep; // 1,800 for normal vive hardware. (guessed) + int32_t pulse_synctime_offset; // 20,000 for normal vive hardware. (guessed) + int32_t pulse_synctime_slack; // 5,000 for normal vive hardware. (guessed) + + // Flood info, for calculating which laser is currently sweeping. + void *disambiguator_data; + int8_t oldcode; + int8_t sync_set_number; // 0 = master, 1 = slave, -1 = fault. + int8_t did_handle_ootx; // If unset, will send lightcap data for sync pulses next time a sensor is hit. uint32_t last_sync_time[NUM_LIGHTHOUSES]; uint32_t last_sync_length[NUM_LIGHTHOUSES]; uint32_t recent_sync_time; - uint32_t last_lighttime; //May be a 24- or 32- bit number depending on what device. - + uint32_t last_lighttime; // May be a 24- or 32- bit number depending on what device. - FLT* acc_bias; // size is FLT*3. contains x,y,z - FLT* acc_scale; // size is FLT*3. contains x,y,z - FLT* gyro_bias; // size is FLT*3. contains x,y,z - FLT* gyro_scale; // size is FLT*3. contains x,y,z + FLT *acc_bias; // size is FLT*3. contains x,y,z + FLT *acc_scale; // size is FLT*3. contains x,y,z + FLT *gyro_bias; // size is FLT*3. contains x,y,z + FLT *gyro_scale; // size is FLT*3. contains x,y,z haptic_func haptic; SurviveSensorActivations activations; - //Debug + // Debug int tsl; }; @@ -125,34 +124,37 @@ SURVIVE_EXPORT int8_t survive_object_sensor_ct(SurviveObject *so); SURVIVE_EXPORT const FLT *survive_object_sensor_locations(SurviveObject *so); SURVIVE_EXPORT const FLT *survive_object_sensor_normals(SurviveObject *so); -struct BaseStationData -{ - uint8_t PositionSet:1; +typedef struct BaseStationCal { + FLT phase[2]; + FLT tilt[2]; + FLT curve[2]; + FLT gibpha[2]; + FLT gibmag[2]; +} BaseStationCal; + +struct BaseStationData { + uint8_t PositionSet : 1; SurvivePose Pose; - uint8_t OOTXSet:1; + uint8_t OOTXSet : 1; uint32_t BaseStationID; - FLT fcalphase[2]; - FLT fcaltilt[2]; - FLT fcalcurve[2]; - FLT fcalgibpha[2]; - FLT fcalgibmag[2]; - int8_t accel[3]; //"Up" vector + + BaseStationCal fcal; + + int8_t accel[3]; //"Up" vector + uint8_t mode; }; struct config_group; #define BUTTON_QUEUE_MAX_LEN 32 - - // note: buttonId and axisId are 1-indexed values. // a value of 0 for an id means that no data is present in that value // additionally, when x and y values are both present in axis data, // axis1 will be x, axis2 will be y. -typedef struct -{ - uint8_t isPopulated; //probably can remove this given the semaphore in the parent struct. helps with debugging +typedef struct { + uint8_t isPopulated; // probably can remove this given the semaphore in the parent struct. helps with debugging uint8_t eventType; uint8_t buttonId; uint8_t axis1Id; @@ -162,20 +164,28 @@ typedef struct SurviveObject *so; } ButtonQueueEntry; -typedef struct -{ - uint8_t nextReadIndex; //init to 0 +typedef struct { + uint8_t nextReadIndex; // init to 0 uint8_t nextWriteIndex; // init to 0 - void* buttonservicesem; + void *buttonservicesem; ButtonQueueEntry entry[BUTTON_QUEUE_MAX_LEN]; } ButtonQueue; typedef enum { SURVIVE_STOPPED = 0, SURVIVE_RUNNING, SURVIVE_CLOSING, SURVIVE_STATE_MAX } SurviveState; struct SurviveRecordingData; +struct survive_calibration_config; + +enum SurviveCalFlag { + SVCal_None = 0, + SVCal_Phase = 1, + SVCal_Tilt = 2, + SVCal_Curve = 4, + SVCal_Gib = 8, + SVCal_All = SVCal_Gib | SVCal_Curve | SVCal_Tilt | SVCal_Phase +}; -struct SurviveContext -{ +struct SurviveContext { text_feedback_func faultfunction; text_feedback_func notefunction; light_process_func lightproc; @@ -187,35 +197,39 @@ struct SurviveContext htc_config_func configfunction; handle_lightcap_func lightcapfunction; - struct config_group* global_config_values; - struct config_group* lh_config; //lighthouse configs - struct config_group* temporary_config_values; //Set per-session, from command-line. Not saved but override global_config_values + struct config_group *global_config_values; + struct config_group *lh_config; // lighthouse configs + struct config_group + *temporary_config_values; // Set per-session, from command-line. Not saved but override global_config_values - //Calibration data: + // Calibration data: int activeLighthouses; BaseStationData bsd[NUM_LIGHTHOUSES]; - SurviveCalData * calptr; //If and only if the calibration subsystem is attached. + SurviveCalData *calptr; // If and only if the calibration subsystem is attached. struct SurviveRecordingData *recptr; // Iff recording is attached - SurviveObject ** objs; + SurviveObject **objs; int objs_ct; - void ** drivers; - DeviceDriverCb * driverpolls; - DeviceDriverCb * drivercloses; - DeviceDriverMagicCb * drivermagics; + void **drivers; + DeviceDriverCb *driverpolls; + DeviceDriverCb *drivercloses; + DeviceDriverMagicCb *drivermagics; int driver_ct; SurviveState state; - void* buttonservicethread; + void *buttonservicethread; ButtonQueue buttonQueue; void *user_ptr; + enum SurviveCalFlag calibration_flag; + struct survive_calibration_config *calibration_config; }; -void survive_verify_FLT_size(uint32_t user_size); // Baked in size of FLT to verify users of the library have the correct setting. +void survive_verify_FLT_size( + uint32_t user_size); // Baked in size of FLT to verify users of the library have the correct setting. -SURVIVE_EXPORT SurviveContext * survive_init_internal( int argc, char * const * argv ); +SURVIVE_EXPORT SurviveContext *survive_init_internal(int argc, char *const *argv); /** * Call survive_init to get a populated SurviveContext pointer. @@ -227,98 +241,106 @@ SURVIVE_EXPORT SurviveContext * survive_init_internal( int argc, char * const * * Note that this function _can_ return null based on command line arguments, * notably if -h was passed in. */ -static inline SurviveContext * survive_init( int argc, char * const * argv ) -{ +static inline SurviveContext *survive_init(int argc, char *const *argv) { survive_verify_FLT_size(sizeof(FLT)); return survive_init_internal(argc, argv); } - -//For any of these, you may pass in 0 for the function pointer to use default behavior. -//In general unless you are doing wacky things like recording or playing back data, you won't need to use this. -SURVIVE_EXPORT void survive_install_htc_config_fn( SurviveContext *ctx, htc_config_func fbp ); -SURVIVE_EXPORT void survive_install_info_fn( SurviveContext * ctx, text_feedback_func fbp ); -SURVIVE_EXPORT void survive_install_error_fn( SurviveContext * ctx, text_feedback_func fbp ); -SURVIVE_EXPORT void survive_install_light_fn( SurviveContext * ctx, light_process_func fbp ); -SURVIVE_EXPORT void survive_install_imu_fn( SurviveContext * ctx, imu_process_func fbp ); -SURVIVE_EXPORT void survive_install_angle_fn( SurviveContext * ctx, angle_process_func fbp ); -SURVIVE_EXPORT void survive_install_button_fn(SurviveContext * ctx, button_process_func fbp); -SURVIVE_EXPORT void survive_install_raw_pose_fn(SurviveContext * ctx, raw_pose_func fbp); +// For any of these, you may pass in 0 for the function pointer to use default behavior. +// In general unless you are doing wacky things like recording or playing back data, you won't need to use this. +SURVIVE_EXPORT void survive_install_htc_config_fn(SurviveContext *ctx, htc_config_func fbp); +SURVIVE_EXPORT void survive_install_info_fn(SurviveContext *ctx, text_feedback_func fbp); +SURVIVE_EXPORT void survive_install_error_fn(SurviveContext *ctx, text_feedback_func fbp); +SURVIVE_EXPORT void survive_install_light_fn(SurviveContext *ctx, light_process_func fbp); +SURVIVE_EXPORT void survive_install_imu_fn(SurviveContext *ctx, imu_process_func fbp); +SURVIVE_EXPORT void survive_install_angle_fn(SurviveContext *ctx, angle_process_func fbp); +SURVIVE_EXPORT void survive_install_button_fn(SurviveContext *ctx, button_process_func fbp); +SURVIVE_EXPORT void survive_install_raw_pose_fn(SurviveContext *ctx, raw_pose_func fbp); SURVIVE_EXPORT void survive_install_lighthouse_pose_fn(SurviveContext *ctx, lighthouse_pose_func fbp); -SURVIVE_EXPORT int survive_startup( SurviveContext * ctx ); -SURVIVE_EXPORT int survive_poll( SurviveContext * ctx ); -SURVIVE_EXPORT void survive_close( SurviveContext * ctx ); - -SURVIVE_EXPORT SurviveObject * survive_get_so_by_name( SurviveContext * ctx, const char * name ); +SURVIVE_EXPORT int survive_startup(SurviveContext *ctx); +SURVIVE_EXPORT int survive_poll(SurviveContext *ctx); +SURVIVE_EXPORT void survive_close(SurviveContext *ctx); -//Utilitiy functions. -int survive_simple_inflate( SurviveContext * ctx, const char * input, int inlen, char * output, int outlen ); -int survive_send_magic( SurviveContext * ctx, int magic_code, void * data, int datalen ); +SURVIVE_EXPORT SurviveObject *survive_get_so_by_name(SurviveContext *ctx, const char *name); -//These functions search both the stored-general and temporary sections for a parameter and return it. -#define SC_GET 0 //Get, only. -#define SC_SET 1 //Set, if not present -#define SC_OVERRIDE 2 //Set, to new default value. -#define SC_SETCONFIG 4 //Set, both in-memory and config file. Use in conjunction with SC_OVERRIDE. +// Utilitiy functions. +int survive_simple_inflate(SurviveContext *ctx, const char *input, int inlen, char *output, int outlen); +int survive_send_magic(SurviveContext *ctx, int magic_code, void *data, int datalen); -SURVIVE_EXPORT FLT survive_configf( SurviveContext * ctx, const char *tag, char flags, FLT def ); -SURVIVE_EXPORT uint32_t survive_configi( SurviveContext * ctx, const char *tag, char flags, uint32_t def ); -SURVIVE_EXPORT const char * survive_configs( SurviveContext * ctx, const char *tag, char flags, const char *def ); +// These functions search both the stored-general and temporary sections for a parameter and return it. +#define SC_GET 0 // Get, only. +#define SC_SET 1 // Set, if not present +#define SC_OVERRIDE 2 // Set, to new default value. +#define SC_SETCONFIG 4 // Set, both in-memory and config file. Use in conjunction with SC_OVERRIDE. +SURVIVE_EXPORT FLT survive_configf(SurviveContext *ctx, const char *tag, char flags, FLT def); +SURVIVE_EXPORT uint32_t survive_configi(SurviveContext *ctx, const char *tag, char flags, uint32_t def); +SURVIVE_EXPORT const char *survive_configs(SurviveContext *ctx, const char *tag, char flags, const char *def); -//Install the calibrator. -SURVIVE_EXPORT void survive_cal_install( SurviveContext * ctx ); //XXX This will be removed if not already done so. +// Install the calibrator. +SURVIVE_EXPORT void survive_cal_install(SurviveContext *ctx); // XXX This will be removed if not already done so. // Read back a human-readable string description of the calibration status -SURVIVE_EXPORT int survive_cal_get_status( SurviveContext * ctx, char * description, int description_length ); +SURVIVE_EXPORT int survive_cal_get_status(SurviveContext *ctx, char *description, int description_length); // Induce haptic feedback -SURVIVE_EXPORT int survive_haptic(SurviveObject * so, uint8_t reserved, uint16_t pulseHigh, uint16_t pulseLow, uint16_t repeatCount); - -//Call these from your callback if overridden. -//Accept higher-level data. -SURVIVE_EXPORT void survive_default_light_process( SurviveObject * so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length , uint32_t lh); -SURVIVE_EXPORT void survive_default_imu_process( SurviveObject * so, int mode, FLT * accelgyro, uint32_t timecode, int id ); -SURVIVE_EXPORT void survive_default_angle_process( SurviveObject * so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh ); -SURVIVE_EXPORT void survive_default_button_process(SurviveObject * so, uint8_t eventType, uint8_t buttonId, uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, uint16_t axis2Val); +SURVIVE_EXPORT int survive_haptic(SurviveObject *so, uint8_t reserved, uint16_t pulseHigh, uint16_t pulseLow, + uint16_t repeatCount); + +// Call these from your callback if overridden. +// Accept higher-level data. +SURVIVE_EXPORT void survive_default_light_process(SurviveObject *so, int sensor_id, int acode, int timeinsweep, + uint32_t timecode, uint32_t length, uint32_t lh); +SURVIVE_EXPORT void survive_default_imu_process(SurviveObject *so, int mode, FLT *accelgyro, uint32_t timecode, int id); +SURVIVE_EXPORT void survive_default_angle_process(SurviveObject *so, int sensor_id, int acode, uint32_t timecode, + FLT length, FLT angle, uint32_t lh); +SURVIVE_EXPORT void survive_default_button_process(SurviveObject *so, uint8_t eventType, uint8_t buttonId, + uint8_t axis1Id, uint16_t axis1Val, uint8_t axis2Id, + uint16_t axis2Val); SURVIVE_EXPORT void survive_default_raw_pose_process(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose); -SURVIVE_EXPORT void survive_default_lighthouse_pose_process(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *lh_pose, - SurvivePose *obj_pose); -SURVIVE_EXPORT int survive_default_htc_config_process(SurviveObject *so, char *ct0conf, int len); - - +SURVIVE_EXPORT void survive_default_lighthouse_pose_process(SurviveContext *ctx, uint8_t lighthouse, + SurvivePose *lh_pose, SurvivePose *obj_pose); +SURVIVE_EXPORT int survive_default_htc_config_process(SurviveObject *so, char *ct0conf, int len); ////////////////////// Survive Drivers //////////////////////////// -void RegisterDriver(const char * name, void * data); +void RegisterDriver(const char *name, void *data); #ifdef _MSC_VER -#define REGISTER_LINKTIME( func ) \ - __pragma(comment(linker,"/export:REGISTER"#func));\ +#define REGISTER_LINKTIME(func) \ + __pragma(comment(linker, "/export:REGISTER" #func)); \ void REGISTER##func() { RegisterDriver(#func, &func); } #else -#define REGISTER_LINKTIME( func ) \ +#define REGISTER_LINKTIME(func) \ void __attribute__((constructor)) REGISTER##func() { RegisterDriver(#func, &func); } #endif - - ///////////////////////// General stuff for writing drivers /////// -//For device drivers to call. This actually attaches them. -int survive_add_object( SurviveContext * ctx, SurviveObject * obj ); -void survive_add_driver( SurviveContext * ctx, void * payload, DeviceDriverCb poll, DeviceDriverCb close, DeviceDriverMagicCb magic ); - -//This is the disambiguator function, for taking light timing and figuring out place-in-sweep for a given photodiode. -void handle_lightcap( SurviveObject * so, LightcapElement * le ); - -#define SV_INFO( ... ) { char stbuff[1024]; sprintf( stbuff, __VA_ARGS__ ); ctx->notefunction( ctx, stbuff ); } -#define SV_ERROR( ... ) { char stbuff[1024]; sprintf( stbuff, __VA_ARGS__ ); ctx->faultfunction( ctx, stbuff ); } -#define SV_KILL() exit(0) //XXX This should likely be re-defined. +// For device drivers to call. This actually attaches them. +int survive_add_object(SurviveContext *ctx, SurviveObject *obj); +void survive_add_driver(SurviveContext *ctx, void *payload, DeviceDriverCb poll, DeviceDriverCb close, + DeviceDriverMagicCb magic); + +// This is the disambiguator function, for taking light timing and figuring out place-in-sweep for a given photodiode. +void handle_lightcap(SurviveObject *so, LightcapElement *le); + +#define SV_INFO(...) \ + { \ + char stbuff[1024]; \ + sprintf(stbuff, __VA_ARGS__); \ + ctx->notefunction(ctx, stbuff); \ + } +#define SV_ERROR(...) \ + { \ + char stbuff[1024]; \ + sprintf(stbuff, __VA_ARGS__); \ + ctx->faultfunction(ctx, stbuff); \ + } +#define SV_KILL() exit(0) // XXX This should likely be re-defined. #ifdef __cplusplus }; #endif #endif - diff --git a/include/libsurvive/survive_reproject.h b/include/libsurvive/survive_reproject.h index 961db2a..c90d39c 100644 --- a/include/libsurvive/survive_reproject.h +++ b/include/libsurvive/survive_reproject.h @@ -1,6 +1,8 @@ #pragma once + #include "survive.h" #include +#include #include #ifdef __cplusplus @@ -13,7 +15,7 @@ typedef struct { bool swap; } survive_calibration_options_config; -typedef struct { +typedef struct survive_calibration_config { survive_calibration_options_config phase, tilt, curve, gibMag, gibPhase; @@ -21,10 +23,10 @@ typedef struct { } survive_calibration_config; -void survive_calibration_options_config_apply( - const survive_calibration_options_config *option, const FLT *input, - FLT *output); -const survive_calibration_config *survive_calibration_default_config(); +void survive_calibration_options_config_apply(const survive_calibration_options_config *option, const FLT *input, + FLT *output); + +const survive_calibration_config *survive_calibration_default_config(const SurviveContext *ctx); size_t survive_calibration_config_max_idx(); @@ -32,10 +34,9 @@ survive_calibration_config survive_calibration_config_create_from_idx(size_t v); size_t survive_calibration_config_index(const survive_calibration_config *config); -void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, - FLT *out); -void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, - const SurvivePose *pose, FLT *point3d, +void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, FLT *out); + +void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, const SurvivePose *pose, FLT *point3d, FLT *out); // This is given a lighthouse -- in the same system as stored in BaseStationData, and @@ -44,9 +45,19 @@ void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, // While this is typically opposite of what we want to do -- we want to find the 3d // position from a 2D coordinate, this is helpful since the minimization of reprojection // error is a core mechanism to many types of solvers. -void survive_reproject_from_pose_with_config( - const SurviveContext *ctx, const survive_calibration_config *config, - int lighthouse, const SurvivePose *pose, const FLT *point3d, FLT *out); +void survive_reproject_from_pose_with_config(const SurviveContext *ctx, const survive_calibration_config *config, + int lighthouse, const SurvivePose *pose, const FLT *point3d, FLT *out); + +void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const survive_calibration_config *config, + const SurvivePose *pose, const FLT *point3d, FLT *out); + +void survive_reproject_with_config(const SurviveContext *ctx, const survive_calibration_config *config, int lighthouse, + const FLT *point3d, FLT *out); + +void survive_calibration_config_fprint(FILE *file, const survive_calibration_config *config); + +void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, enum SurviveCalFlag f, const FLT *in, FLT *out); +void survive_apply_bsd_calibration(SurviveContext *ctx, int lh, const FLT *in, FLT *out); #ifdef __cplusplus } diff --git a/src/poser_epnp.c b/src/poser_epnp.c index 7e86542..c05450a 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -6,6 +6,7 @@ #include #include +#include #include "epnp/epnp.h" #include "linmath.h" @@ -71,7 +72,9 @@ static int opencv_solver_fullscene(SurviveObject *so, PoserDataFullScene *pdfs) for (size_t i = 0; i < so->sensor_ct; i++) { FLT *lengths = pdfs->lengths[i][lh]; - FLT *ang = pdfs->angles[i][lh]; + FLT *_ang = pdfs->angles[i][lh]; + FLT ang[2]; + survive_apply_bsd_calibration(so->ctx, lh, _ang, ang); if (lengths[0] < 0 || lengths[1] < 0) continue; @@ -103,7 +106,10 @@ static void add_correspondences(SurviveObject *so, epnp *pnp, SurviveSensorActiv for (size_t sensor_idx = 0; sensor_idx < so->sensor_ct; sensor_idx++) { if (SurviveSensorActivations_isPairValid(scene, SurviveSensorActivations_default_tolerance, timecode, sensor_idx, lh)) { - double *angles = scene->angles[sensor_idx][lh]; + FLT *_angles = scene->angles[sensor_idx][lh]; + FLT angles[2]; + survive_apply_bsd_calibration(so->ctx, lh, _angles, angles); + epnp_add_correspondence(pnp, so->sensor_locations[sensor_idx * 3 + 0], so->sensor_locations[sensor_idx * 3 + 1], so->sensor_locations[sensor_idx * 3 + 2], tan(angles[0]), tan(angles[1])); diff --git a/src/poser_sba.c b/src/poser_sba.c index df28a2d..4a4ed8f 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -40,6 +40,8 @@ typedef struct SBAData { int successes_to_reset; int successes_to_reset_cntr; + FLT max_error; + FLT sensor_variance; FLT sensor_variance_per_second; int sensor_time_window; @@ -71,7 +73,9 @@ static size_t construct_input(const SurviveObject *so, PoserDataFullScene *pdfs, continue; } - double *angles = pdfs->angles[sensor][lh]; + double *_angles = pdfs->angles[sensor][lh]; + double angles[2]; + survive_apply_bsd_calibration(so->ctx, lh, _angles, angles); vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; meas[measCount++] = angles[0]; @@ -89,7 +93,9 @@ static size_t construct_input_from_scene(SBAData *d, PoserDataLight *pdl, Surviv for (size_t sensor = 0; sensor < so->sensor_ct; sensor++) { for (size_t lh = 0; lh < 2; lh++) { if (SurviveSensorActivations_isPairValid(scene, d->sensor_time_window, pdl->timecode, sensor, lh)) { - double *a = scene->angles[sensor][lh]; + double *_a = scene->angles[sensor][lh]; + FLT a[2]; + survive_apply_bsd_calibration(so->ctx, lh, _a, a); vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; if (cov) { @@ -273,7 +279,7 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o if (distance > 1.) status = -1; } - if (status > 0) { + if (status > 0 && (info[1] / meas_size * 2) < d->max_error) { d->failures_to_reset_cntr = d->failures_to_reset; quatnormalize(soLocation.Rot, soLocation.Rot); PoserData_poser_raw_pose_func(&pdl->hdr, so, 1, &soLocation); @@ -283,7 +289,7 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o SurviveContext *ctx = so->ctx; // Docs say info[0] should be divided by meas; I don't buy it really... static int cnt = 0; - if (cnt++ > 1000 || meas_size < d->required_meas) { + if (cnt++ > 1000 || meas_size < d->required_meas || (info[1] / meas_size * 2) > d->max_error) { SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (int)meas_size); SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); cnt = 0; @@ -389,11 +395,12 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { d->failures_to_reset_cntr = 0; d->failures_to_reset = survive_configi(ctx, "sba-failures-to-reset", SC_GET, 1); d->successes_to_reset_cntr = 0; - d->successes_to_reset = survive_configi(ctx, "sba-successes-to-reset", SC_GET, 1); + d->successes_to_reset = survive_configi(ctx, "sba-successes-to-reset", SC_GET, 100); d->required_meas = survive_configi(ctx, "sba-required-meas", SC_GET, 8); - - d->sensor_time_window = survive_configi(ctx, "sba-time-window", SC_GET, 1600000 * 4); + d->max_error = survive_configf(ctx, "sba-max-error", SC_GET, .0001); + d->sensor_time_window = + survive_configi(ctx, "sba-time-window", SC_GET, SurviveSensorActivations_default_tolerance * 2); d->sensor_variance_per_second = survive_configf(ctx, "sba-sensor-variance-per-sec", SC_GET, 0.001); d->sensor_variance = survive_configf(ctx, "sba-sensor-variance", SC_GET, 1.0); d->so = so; @@ -403,6 +410,7 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { SV_INFO("\tsba-sensor-variance: %f", d->sensor_variance); SV_INFO("\tsba-sensor-variance-per-sec: %f", d->sensor_variance_per_second); SV_INFO("\tsba-time-window: %d", d->sensor_time_window); + SV_INFO("\tsba-max-error: %f", d->max_error); } SBAData *d = so->PoserData; switch (pd->pt) { @@ -416,8 +424,8 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { // only process sweeps FLT error = -1; if (d->last_lh != lightData->lh || d->last_acode != lightData->acode) { - survive_calibration_config config = *survive_calibration_default_config(); - error = run_sba_find_3d_structure(d, config, lightData, scene, 50, .5); + survive_calibration_config config = *survive_calibration_default_config(ctx); + error = run_sba_find_3d_structure(d, config, lightData, scene, 100, .5); d->last_lh = lightData->lh; d->last_acode = lightData->acode; } @@ -435,9 +443,9 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { case POSERDATA_FULL_SCENE: { SurviveContext *ctx = so->ctx; PoserDataFullScene *pdfs = (PoserDataFullScene *)(pd); - survive_calibration_config config = *survive_calibration_default_config(); + survive_calibration_config config = *survive_calibration_default_config(ctx); SV_INFO("Running sba with %u", (int)survive_calibration_config_index(&config)); - double error = run_sba(config, pdfs, so, 50, .005); + double error = run_sba(config, pdfs, so, 100, .005); // std::cerr << "Average reproj error: " << error << std::endl; return 0; } diff --git a/src/survive.c b/src/survive.c index a15e0ed..63ad2ba 100644 --- a/src/survive.c +++ b/src/survive.c @@ -219,6 +219,8 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { ctx->configfunction = survive_default_htc_config_process; ctx->rawposeproc = survive_default_raw_pose_process; + ctx->calibration_flag = (enum SurviveCalFlag)survive_configi(ctx, "bsd-cal", SC_GET, SVCal_All); + return ctx; } diff --git a/src/survive_cal.c b/src/survive_cal.c index 2fc1896..e094e7b 100755 --- a/src/survive_cal.c +++ b/src/survive_cal.c @@ -61,19 +61,20 @@ void ootx_packet_clbk_d(ootx_decoder_context *ct, ootx_packet* packet) //print_lighthouse_info_v6(&v6); b->BaseStationID = v6.id; - b->fcalphase[0] = v6.fcal_0_phase; - b->fcalphase[1] = v6.fcal_1_phase; - b->fcaltilt[0] = tan(v6.fcal_0_tilt); - b->fcaltilt[1] = tan(v6.fcal_1_tilt); //XXX??? Is this right? See https://github.com/cnlohr/libsurvive/issues/18 - b->fcalcurve[0] = v6.fcal_0_curve; - b->fcalcurve[1] = v6.fcal_1_curve; - b->fcalgibpha[0] = v6.fcal_0_gibphase; - b->fcalgibpha[1] = v6.fcal_1_gibphase; - b->fcalgibmag[0] = v6.fcal_0_gibmag; - b->fcalgibmag[1] = v6.fcal_1_gibmag; + b->fcal.phase[0] = v6.fcal_0_phase; + b->fcal.phase[1] = v6.fcal_1_phase; + b->fcal.tilt[0] = (v6.fcal_0_tilt); + b->fcal.tilt[1] = (v6.fcal_1_tilt); // XXX??? Is this right? See https://github.com/cnlohr/libsurvive/issues/18 + b->fcal.curve[0] = v6.fcal_0_curve; + b->fcal.curve[1] = v6.fcal_1_curve; + b->fcal.gibpha[0] = v6.fcal_0_gibphase; + b->fcal.gibpha[1] = v6.fcal_1_gibphase; + b->fcal.gibmag[0] = v6.fcal_0_gibmag; + b->fcal.gibmag[1] = v6.fcal_1_gibmag; b->accel[0] = v6.accel_dir_x; b->accel[1] = v6.accel_dir_y; b->accel[2] = v6.accel_dir_z; + b->mode = v6.mode_current; b->OOTXSet = 1; config_set_lighthouse(ctx->lh_config,b,id); @@ -617,8 +618,9 @@ static void handle_calibration( struct SurviveCalData *cd ) } fsd.lengths[i][j][0] = cd->avglens[dataindex+0]; fsd.lengths[i][j][1] = cd->avglens[dataindex+1]; - fsd.angles[i][j][0] = cd->avgsweeps[dataindex+0]; - fsd.angles[i][j][1] = cd->avgsweeps[dataindex+1]; + // fsd.angles[i][j][0] = cd->avgsweeps[dataindex+0]; + // fsd.angles[i][j][1] = cd->avgsweeps[dataindex+1]; + survive_apply_bsd_calibration(ctx, lh, &cd->avgsweeps[dataindex], fsd.angles[i][j]); fsd.synctimes[i][j] = temp_syncs[i][j]; } diff --git a/src/survive_config.c b/src/survive_config.c index 7b68ae4..d67cd8e 100644 --- a/src/survive_config.c +++ b/src/survive_config.c @@ -119,12 +119,13 @@ void config_read_lighthouse(config_group *lh_config, BaseStationData *bsd, uint8 FLT defaults[7] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; bsd->BaseStationID = config_read_uint32(cg, "id", 0); + bsd->mode = config_read_uint32(cg, "mode", 0); config_read_float_array(cg, "pose", &bsd->Pose.Pos[0], defaults, 7); - config_read_float_array(cg, "fcalphase", bsd->fcalphase, defaults, 2); - config_read_float_array(cg, "fcaltilt", bsd->fcaltilt, defaults, 2); - config_read_float_array(cg, "fcalcurve", bsd->fcalcurve, defaults, 2); - config_read_float_array(cg, "fcalgibpha", bsd->fcalgibpha, defaults, 2); - config_read_float_array(cg, "fcalgibmag", bsd->fcalgibmag, defaults, 2); + config_read_float_array(cg, "fcalphase", bsd->fcal.phase, defaults, 2); + config_read_float_array(cg, "fcaltilt", bsd->fcal.tilt, defaults, 2); + config_read_float_array(cg, "fcalcurve", bsd->fcal.curve, defaults, 2); + config_read_float_array(cg, "fcalgibpha", bsd->fcal.gibpha, defaults, 2); + config_read_float_array(cg, "fcalgibmag", bsd->fcal.gibmag, defaults, 2); bsd->PositionSet = config_read_uint32(cg, "PositionSet", 0); } @@ -132,12 +133,13 @@ void config_set_lighthouse(config_group *lh_config, BaseStationData *bsd, uint8_ config_group *cg = lh_config + idx; config_set_uint32(cg, "index", idx); config_set_uint32(cg, "id", bsd->BaseStationID); + config_set_uint32(cg, "mode", bsd->mode); config_set_float_a(cg, "pose", &bsd->Pose.Pos[0], 7); - config_set_float_a(cg, "fcalphase", bsd->fcalphase, 2); - config_set_float_a(cg, "fcaltilt", bsd->fcaltilt, 2); - config_set_float_a(cg, "fcalcurve", bsd->fcalcurve, 2); - config_set_float_a(cg, "fcalgibpha", bsd->fcalgibpha, 2); - config_set_float_a(cg, "fcalgibmag", bsd->fcalgibmag, 2); + config_set_float_a(cg, "fcalphase", bsd->fcal.phase, 2); + config_set_float_a(cg, "fcaltilt", bsd->fcal.tilt, 2); + config_set_float_a(cg, "fcalcurve", bsd->fcal.curve, 2); + config_set_float_a(cg, "fcalgibpha", bsd->fcal.gibpha, 2); + config_set_float_a(cg, "fcalgibmag", bsd->fcal.gibmag, 2); config_set_uint32(cg, "PositionSet", bsd->PositionSet); } diff --git a/src/survive_process.c b/src/survive_process.c index 97fbc46..62459f2 100644 --- a/src/survive_process.c +++ b/src/survive_process.c @@ -51,14 +51,17 @@ void survive_default_light_process( SurviveObject * so, int sensor_id, int acode static int use_bsd_cal = -1; if(use_bsd_cal == -1) { use_bsd_cal = survive_configi(ctx, "use-bsd-cal", SC_GET, 1); + if (use_bsd_cal == 0) { + SV_INFO("Not using BSD calibration values"); + } } if(use_bsd_cal) { BaseStationData * bsd = &ctx->bsd[base_station]; - //XXX TODO: This seriously needs to be worked on. See: https://github.com/cnlohr/libsurvive/issues/18 - angle += bsd->fcalphase[axis]; + // XXX TODO: This seriously needs to be worked on. See: https://github.com/cnlohr/libsurvive/issues/18 + // angle += (use_bsd_cal == 2 ? -1 : 1) * bsd->fcal.phase[axis]; // angle += bsd->fcaltilt[axis] * predicted_angle(axis1); - + //TODO!!! } diff --git a/src/survive_reproject.c b/src/survive_reproject.c index eabdb07..845f30a 100644 --- a/src/survive_reproject.c +++ b/src/survive_reproject.c @@ -1,6 +1,7 @@ #include "survive_reproject.h" #include <../redist/linmath.h> #include +#include #include static void survive_calibration_options_config_normalize( @@ -72,9 +73,8 @@ static FLT gibf(bool useSin, FLT v) { return cos(v); } -void survive_reproject_from_pose_with_config( - const SurviveContext *ctx, const survive_calibration_config *config, - int lighthouse, const SurvivePose *pose, const FLT *pt, FLT *out) { +void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const survive_calibration_config *config, + const SurvivePose *pose, const FLT *pt, FLT *out) { LinmathQuat invq; quatgetreciprocal(invq, pose->Rot); @@ -92,33 +92,36 @@ void survive_reproject_from_pose_with_config( double ang_x = atan(x); double ang_y = atan(y); - const BaseStationData *bsd = &ctx->bsd[lighthouse]; double phase[2]; - survive_calibration_options_config_apply(&config->phase, bsd->fcalphase, - phase); + survive_calibration_options_config_apply(&config->phase, bsd->fcal.phase, phase); double tilt[2]; - survive_calibration_options_config_apply(&config->tilt, bsd->fcaltilt, - tilt); + survive_calibration_options_config_apply(&config->tilt, bsd->fcal.tilt, tilt); double curve[2]; - survive_calibration_options_config_apply(&config->curve, bsd->fcalcurve, - curve); + survive_calibration_options_config_apply(&config->curve, bsd->fcal.curve, curve); double gibPhase[2]; - survive_calibration_options_config_apply(&config->gibPhase, bsd->fcalgibpha, - gibPhase); + survive_calibration_options_config_apply(&config->gibPhase, bsd->fcal.gibpha, gibPhase); double gibMag[2]; - survive_calibration_options_config_apply(&config->gibMag, bsd->fcalgibmag, - gibMag); + survive_calibration_options_config_apply(&config->gibMag, bsd->fcal.gibmag, gibMag); - out[0] = ang_x + phase[0] + tan(tilt[0]) * y + curve[0] * y * y + + out[0] = ang_x + phase[0] + (tilt[0]) * ang_y + curve[0] * ang_y * ang_y + gibf(config->gibUseSin, gibPhase[0] + ang_x) * gibMag[0]; - out[1] = ang_y + phase[1] + tan(tilt[1]) * x + curve[1] * x * x + + out[1] = ang_y + phase[1] + (tilt[1]) * ang_x + curve[1] * ang_x * ang_x + gibf(config->gibUseSin, gibPhase[1] + ang_y) * gibMag[1]; } +void survive_reproject_from_pose_with_config(const SurviveContext *ctx, const survive_calibration_config *config, + int lighthouse, const SurvivePose *pose, const FLT *pt, FLT *out) { + const BaseStationData *bsd = &ctx->bsd[lighthouse]; + survive_reproject_from_pose_with_bsd(bsd, config, pose, pt, out); +} + +void survive_reproject_with_config(const SurviveContext *ctx, const survive_calibration_config *config, int lighthouse, + const FLT *point3d, FLT *out) { + survive_reproject_from_pose_with_config(ctx, config, lighthouse, &ctx->bsd[lighthouse].Pose, point3d, out); +} void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, const SurvivePose *pose, FLT *pt, FLT *out) { - survive_reproject_from_pose_with_config( - ctx, survive_calibration_default_config(), lighthouse, pose, pt, out); + survive_reproject_from_pose_with_config(ctx, survive_calibration_default_config(ctx), lighthouse, pose, pt, out); } void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, @@ -127,14 +130,15 @@ void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, point3d, out); } -const survive_calibration_config *survive_calibration_default_config() { - static survive_calibration_config *def = 0; - if (def == 0) { - def = malloc(sizeof(survive_calibration_config)); - memset(def, 0, sizeof(survive_calibration_config)); - *def = survive_calibration_config_create_from_idx(0); +const survive_calibration_config *survive_calibration_default_config(const SurviveContext *_ctx) { + SurviveContext *ctx = (SurviveContext *)_ctx; + if (ctx->calibration_config == 0) { + size_t idx = survive_configi(ctx, "default-cal-conf", SC_GET, 0); + ctx->calibration_config = malloc(sizeof(survive_calibration_config)); + memset(ctx->calibration_config, 0, sizeof(survive_calibration_config)); + *ctx->calibration_config = survive_calibration_config_create_from_idx(idx); } - return def; + return ctx->calibration_config; } size_t survive_calibration_config_max_idx() { @@ -142,3 +146,78 @@ size_t survive_calibration_config_max_idx() { memset(&cfg, 0x1, sizeof(survive_calibration_config)); return survive_calibration_config_index(&cfg); } + +static void survive_calibration_options_config_fprint(FILE *file, const survive_calibration_options_config *self) { + fprintf(file, "\t"); + if (!self->enable[0] && !self->enable[1]) { + fprintf(file, "disabled"); + return; + } + + fprintf(file, "swap: %d\n", self->swap); + for (int i = 0; i < 2; i++) { + if (self->enable[i]) { + fprintf(file, "\tinvert[%d]: %d", i, self->invert[i]); + } else { + fprintf(file, "\t%d: disabled", i); + } + } +} + +void survive_calibration_config_fprint(FILE *file, const survive_calibration_config *self) { + fprintf(file, "Index: %ld\n", survive_calibration_config_index(self)); + + fprintf(file, "Phase: \n"); + survive_calibration_options_config_fprint(file, &self->phase); + fprintf(file, "\n"); + + fprintf(file, "Tilt: \n"); + survive_calibration_options_config_fprint(file, &self->tilt); + fprintf(file, "\n"); + + fprintf(file, "Curve: \n"); + survive_calibration_options_config_fprint(file, &self->curve); + fprintf(file, "\n"); + + fprintf(file, "gibPhase: \n"); + survive_calibration_options_config_fprint(file, &self->gibPhase); + fprintf(file, "\n"); + + fprintf(file, "gibMag: \n"); + survive_calibration_options_config_fprint(file, &self->gibMag); + fprintf(file, "\n"); + + fprintf(file, "gibUseSin: %d\n", self->gibUseSin); +} + +void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, enum SurviveCalFlag f, const FLT *in, + FLT *out) { + const BaseStationCal *cal = &ctx->bsd[lh].fcal; + out[0] = in[0] + cal->phase[0]; + out[1] = in[1] + cal->phase[1]; + + FLT tilt_scale = 10; + FLT curve_scale = 10000; + FLT gib_scale = 10; + const int iterations = 4; + for (int i = 0; i < iterations; i++) { + FLT last_out[2] = {out[0], out[1]}; + bool last_iteration = i == iterations - 1; + for (int j = 0; j < 2; j++) { + int oj = j == 0 ? 1 : 0; + out[j] = in[j]; + if (!last_iteration || (f & SVCal_Phase)) + out[j] += (cal->phase[j]); + if (!last_iteration || (f & SVCal_Tilt)) + out[j] += tan(cal->tilt[j] / tilt_scale) * last_out[oj]; + if (!last_iteration || (f & SVCal_Curve)) + out[j] += (cal->curve[j] / curve_scale) * last_out[oj] * last_out[oj]; + if (!last_iteration || (f & SVCal_Gib)) + out[j] += cos(cal->gibpha[j] + last_out[j]) * cal->gibmag[1] / gib_scale; + } + } +} + +void survive_apply_bsd_calibration(SurviveContext *ctx, int lh, const FLT *in, FLT *out) { + survive_apply_bsd_calibration_by_flag(ctx, lh, ctx->calibration_flag, in, out); +} diff --git a/src/survive_sensor_activations.c b/src/survive_sensor_activations.c index e42b50e..dc5c0d4 100644 --- a/src/survive_sensor_activations.c +++ b/src/survive_sensor_activations.c @@ -1,3 +1,4 @@ +#include #include bool SurviveSensorActivations_isPairValid(const SurviveSensorActivations *self, uint32_t tolerance, @@ -28,4 +29,4 @@ void SurviveSensorActivations_add(SurviveSensorActivations *self, struct PoserDa *length = lightData->length * 48000000; } -uint32_t SurviveSensorActivations_default_tolerance = (uint32_t)(48000000 /*mhz*/ * (16.7 * 2 /*ms*/) / 1000); +uint32_t SurviveSensorActivations_default_tolerance = (uint32_t)(48000000 /*mhz*/ * (16.7 * 2 /*ms*/) / 1000) + 5000; diff --git a/tools/findoptimalconfig/Makefile b/tools/findoptimalconfig/Makefile index 5e14814..f174812 100644 --- a/tools/findoptimalconfig/Makefile +++ b/tools/findoptimalconfig/Makefile @@ -7,7 +7,8 @@ LIBSURVIVE:=$(SRT)/lib/libsurvive.so CFLAGS:=-I$(SRT)/redist -I$(SRT)/include -O0 -g -DFLT=double -DUSE_DOUBLE #-fsanitize=address -fsanitize=undefined LDFLAGS:=-lm -lpthread -llapacke -lcblas -findoptimalconfig : findoptimalconfig.cc $(LIBSURVIVE) +findoptimalconfig : findoptimalconfig.cc $(LIBSURVIVE) + cd ../..;make g++ $(CFLAGS) -o $@ $^ $(LDFLAGS) clean : diff --git a/tools/findoptimalconfig/findoptimalconfig.cc b/tools/findoptimalconfig/findoptimalconfig.cc index 543958b..874ed84 100644 --- a/tools/findoptimalconfig/findoptimalconfig.cc +++ b/tools/findoptimalconfig/findoptimalconfig.cc @@ -9,6 +9,8 @@ #include #include +#include + std::ostream &operator<<(std::ostream &o, const survive_calibration_options_config &self) { o << "\t"; if (!self.enable[0] && !self.enable[1]) { @@ -49,7 +51,7 @@ struct SBAData { FLT sensor_variance = 1.; FLT sensor_variance_per_second = 0; - int sensor_time_window = 1600000; + int sensor_time_window = SurviveSensorActivations_default_tolerance; int required_meas = 8; }; @@ -57,10 +59,12 @@ struct SBAData { struct PlaybackDataInput { SurviveObject *so = nullptr; SurvivePose position; - + uint32_t timestamp; std::vector vmask; std::vector meas, cov; - PlaybackDataInput(SurviveObject *so, const SurvivePose &position) : so(so), position(position) { + SurviveSensorActivations activations; + PlaybackDataInput(SurviveObject *so, const SurvivePose &position) + : so(so), position(position), activations(so->activations) { int32_t sensor_count = so->sensor_ct; vmask.resize(sensor_count * NUM_LIGHTHOUSES); cov.resize(4 * sensor_count * NUM_LIGHTHOUSES); @@ -74,6 +78,7 @@ struct PlaybackDataInput { }; struct PlaybackData { + SurviveObject *so = nullptr; BaseStationData bsd[2]; std::vector inputs; }; @@ -116,15 +121,24 @@ void light_process(SurviveObject *so, int sensor_id, int acode, int timeinsweep, survive_default_light_process(so, sensor_id, acode, timeinsweep, timecode, length, lighthouse); } +SurvivePose lastPose = {}; void raw_pose_process(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose) { survive_default_raw_pose_process(so, lighthouse, pose); PlaybackData *d = (PlaybackData *)so->ctx->user_ptr; + d->so = so; d->inputs.emplace_back(so, *pose); auto &input = d->inputs.back(); + input.timestamp = timestamp; int meas = construct_input_from_scene(so, timestamp, &input.vmask.front(), &input.meas.front(), &input.cov.front()); input.shrink(meas / 2); - if (meas / 2 < 12) + + double dist = 0; + if (d->inputs.empty() == false) { + dist = dist3d(pose->Pos, lastPose.Pos); + } + if (meas / 2 < 8 || dist > .00009) d->inputs.pop_back(); + lastPose = *pose; } void lighthouse_process(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *pose, SurvivePose *obj_pose) { @@ -166,7 +180,6 @@ double sba_opt(SurviveContext *ctx, const survive_calibration_config &config, Pl SurviveObject *so = data.so; SurvivePose soLocation = data.position; - bool currentPositionValid = quatmagnitude(&soLocation.Rot[0]) != 0; double opts[SBA_OPTSSZ] = {0}; double info[SBA_INFOSZ] = {0}; @@ -191,6 +204,102 @@ double sba_opt(SurviveContext *ctx, const survive_calibration_config &config, Pl str_metric_function, 0, // jacobia of metric_func &_ctx, // user data + 100, // Max iterations + 0, // verbosity + opts, // options + info); // info + + int meas_size = data.meas.size() / 2; + if (meas_size == 0) + return 0; + + { + SurviveContext *ctx = so->ctx; + // Docs say info[0] should be divided by meas; I don't buy it really... + static int cnt = 0; + if (cnt++ > 1000) { + SV_INFO("%f original reproj error for %u meas", (info[0] / meas_size * 2), (int)meas_size); + SV_INFO("%f cur reproj error", (info[1] / meas_size * 2)); + cnt = 0; + } + } + assert(!isinf(info[1])); + return info[1] / meas_size * 2; +} + +struct optimal_cal_ctx { + std::vector sensors; + SurviveContext *ctx; + survive_calibration_config config; +}; + +static void metric_function(int j, int i, double *aj, double *xij, void *adata) { + optimal_cal_ctx *ctx = (optimal_cal_ctx *)(adata); + + FLT sensorInWorld[3] = {ctx->sensors[i * 3 + 0], ctx->sensors[i * 3 + 1], ctx->sensors[i * 3 + 2]}; + + BaseStationData bsd = ctx->ctx->bsd[j]; + bsd.fcal = *(BaseStationCal *)aj; + + survive_reproject_from_pose_with_bsd(&bsd, &ctx->config, &ctx->ctx->bsd[j].Pose, sensorInWorld, xij); +} + +double find_optimal_cal(SurviveContext *ctx, const survive_calibration_config &config, PlaybackData &data) { + optimal_cal_ctx _ctx; + std::vector vmask; + std::vector cov, meas; + _ctx.ctx = ctx; + _ctx.config = config; + for (auto &in : data.inputs) { + for (size_t sensor = 0; sensor < in.so->sensor_ct; sensor++) { + FLT p[3]; + ApplyPoseToPoint(p, &in.position, &data.so->sensor_locations[sensor * 3]); + _ctx.sensors.emplace_back(p[0]); + _ctx.sensors.emplace_back(p[1]); + _ctx.sensors.emplace_back(p[2]); + for (size_t lh = 0; lh < 1; lh++) { + auto scene = &in.activations; + if (SurviveSensorActivations_isPairValid(scene, settings.sensor_time_window, in.timestamp, sensor, + lh)) { + double *a = scene->angles[sensor][lh]; + vmask.emplace_back(1); //[sensor * NUM_LIGHTHOUSES + lh] = 1; + + meas.emplace_back(a[0]); + meas.emplace_back(a[1]); + } else { + vmask.emplace_back(0); + } + } + } + } + + double *covx = 0; + SurviveObject *so = data.so; + + double opts[SBA_OPTSSZ] = {0}; + double info[SBA_INFOSZ] = {0}; + + BaseStationCal cal[2] = {}; + + opts[0] = SBA_INIT_MU; + opts[1] = SBA_STOP_THRESH; + opts[2] = SBA_STOP_THRESH; + opts[3] = SBA_STOP_THRESH; + opts[3] = SBA_STOP_THRESH; // max_reproj_error * meas.size(); + opts[4] = 0.0; + + int status = sba_mot_levmar(data.inputs.size() * so->sensor_ct, // number of 3d points + 1, // Number of cameras -- 2 lighthouses + 0, // Number of cameras to not modify + &vmask[0], // boolean vis mask + (double *)cal, // camera parameters + 2, // sizeof(BaseStationCal) / sizeof(FLT), + &meas[0], // 2d points for 3d objs + covx, // covariance of measurement. Null sets to identity + 2, // 2 points per image + metric_function, + 0, // jacobia of metric_func + &_ctx, // user data 50, // Max iterations 0, // verbosity opts, // options @@ -200,7 +309,7 @@ double sba_opt(SurviveContext *ctx, const survive_calibration_config &config, Pl } else { assert(false); } - int meas_size = data.meas.size() / 2; + int meas_size = _ctx.sensors.size() / 2; if (meas_size == 0) return 0; @@ -215,17 +324,16 @@ double sba_opt(SurviveContext *ctx, const survive_calibration_config &config, Pl } } assert(!isinf(info[1])); + std::cerr << "Used " << meas_size << " measurements" << std::endl; + + double *_cal = (double *)cal; + for (int i = 0; i < sizeof(BaseStationCal) / sizeof(FLT); i++) + std::cerr << _cal[2 * i] << ", " << _cal[2 * i + 1] << " = " << (info[1] / meas_size * 2) << std::endl; + return info[1] / meas_size * 2; } - double find_avg_reproj_error(SurviveContext *ctx, const survive_calibration_config &config, PlaybackDataInput &data) { - auto vmask = &data.vmask.front(); - auto cov = &data.cov.front(); - auto meas = &data.meas.front(); - double err = 0; - size_t cnt = 0; - - err += sba_opt(ctx, config, data); + return sba_opt(ctx, config, data); /* for (size_t sensor = 0; sensor < data.so->sensor_ct; sensor++) { for (size_t lh = 0; lh < 2; lh++) { @@ -246,7 +354,6 @@ double find_avg_reproj_error(SurviveContext *ctx, const survive_calibration_conf } } }*/ - return err; } double find_avg_reproj_error(SurviveContext *ctx, const survive_calibration_config &config, PlaybackData &data) { @@ -259,10 +366,10 @@ double find_avg_reproj_error(SurviveContext *ctx, const survive_calibration_conf int main(int argc, char **argv) { std::vector> sections = { - {28, 0}, // phase - // { 5, 5 }, // tilt - // { 5, 10 }, // curve - // { 11, 15 } // gibs + useSin + {5, 0}, // phase + //{ 5, 5 }, // tilt + //{ 5, 10 }, // curve + //{ 11, 15 } // gibs + useSin }; for (int i = 1; i < argc; i++) { @@ -279,7 +386,9 @@ int main(int argc, char **argv) { "--defaultposer", "SBA", "--sba-required-meas", - "12", + "8", + "--sba-max-error", + ".1", "--playback", argv[i]}; @@ -293,10 +402,19 @@ int main(int argc, char **argv) { while (survive_poll(ctx) == 0) { } + survive_calibration_config config = {}; + // config.tilt.enable[0] = config.tilt.enable[1] = 1; + // config.curve.enable[0] = config.curve.enable[1] = 1; + config.phase.enable[0] = config.phase.enable[1] = 1; + // config.gibPhase.enable[0] = config.gibPhase.enable[1] = 1; + // config.gibMag.enable[0] = config.gibMag.enable[1] = 1; + + find_optimal_cal(ctx, config, data); + for (int j = 0; j < sections.size(); j++) { auto &range = sections[j]; for (size_t _i = 0; _i < (1 << range.first); _i++) { - int i = _i << range.second; + int i = (_i << range.second); survive_calibration_config config = survive_calibration_config_create_from_idx(i); if (i == survive_calibration_config_index(&config)) { double error = find_avg_reproj_error(ctx, config, data); -- cgit v1.2.3 From 47c7fb15182700fb403894f65beaf143a7fad6ab Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 1 Apr 2018 12:23:48 -0600 Subject: Tweaked how reproject / calibate interact --- include/libsurvive/survive.h | 10 +- include/libsurvive/survive_reproject.h | 37 +---- src/poser_epnp.c | 6 +- src/poser_sba.c | 41 +++-- src/survive.c | 3 +- src/survive_cal.c | 10 +- src/survive_reproject.c | 230 +++++++-------------------- tools/findoptimalconfig/findoptimalconfig.cc | 72 +-------- 8 files changed, 97 insertions(+), 312 deletions(-) diff --git a/include/libsurvive/survive.h b/include/libsurvive/survive.h index e435752..669821d 100644 --- a/include/libsurvive/survive.h +++ b/include/libsurvive/survive.h @@ -185,6 +185,13 @@ enum SurviveCalFlag { SVCal_All = SVCal_Gib | SVCal_Curve | SVCal_Tilt | SVCal_Phase }; +typedef struct survive_calibration_config { + enum SurviveCalFlag use_flag; + FLT phase_scale, tilt_scale, curve_scale, gib_scale; +} survive_calibration_config; + +survive_calibration_config survive_calibration_config_ctor(); + struct SurviveContext { text_feedback_func faultfunction; text_feedback_func notefunction; @@ -222,8 +229,7 @@ struct SurviveContext { ButtonQueue buttonQueue; void *user_ptr; - enum SurviveCalFlag calibration_flag; - struct survive_calibration_config *calibration_config; + struct survive_calibration_config calibration_config; }; void survive_verify_FLT_size( diff --git a/include/libsurvive/survive_reproject.h b/include/libsurvive/survive_reproject.h index c90d39c..6546e66 100644 --- a/include/libsurvive/survive_reproject.h +++ b/include/libsurvive/survive_reproject.h @@ -9,35 +9,12 @@ extern "C" { #endif -typedef struct { - bool enable[2]; - bool invert[2]; - bool swap; -} survive_calibration_options_config; - -typedef struct survive_calibration_config { - - survive_calibration_options_config phase, tilt, curve, gibMag, gibPhase; - - bool gibUseSin; - -} survive_calibration_config; - -void survive_calibration_options_config_apply(const survive_calibration_options_config *option, const FLT *input, - FLT *output); - -const survive_calibration_config *survive_calibration_default_config(const SurviveContext *ctx); - -size_t survive_calibration_config_max_idx(); - -survive_calibration_config survive_calibration_config_create_from_idx(size_t v); - -size_t survive_calibration_config_index(const survive_calibration_config *config); - void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, FLT *out); void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, const SurvivePose *pose, FLT *point3d, FLT *out); +void survive_reproject_from_pose_with_config(const SurviveContext *ctx, struct survive_calibration_config *config, + int lighthouse, const SurvivePose *pose, FLT *point3d, FLT *out); // This is given a lighthouse -- in the same system as stored in BaseStationData, and // a 3d point and finds what the effective 'angle' value for a given lighthouse syste @@ -45,18 +22,12 @@ void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, cons // While this is typically opposite of what we want to do -- we want to find the 3d // position from a 2D coordinate, this is helpful since the minimization of reprojection // error is a core mechanism to many types of solvers. -void survive_reproject_from_pose_with_config(const SurviveContext *ctx, const survive_calibration_config *config, - int lighthouse, const SurvivePose *pose, const FLT *point3d, FLT *out); void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const survive_calibration_config *config, const SurvivePose *pose, const FLT *point3d, FLT *out); -void survive_reproject_with_config(const SurviveContext *ctx, const survive_calibration_config *config, int lighthouse, - const FLT *point3d, FLT *out); - -void survive_calibration_config_fprint(FILE *file, const survive_calibration_config *config); - -void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, enum SurviveCalFlag f, const FLT *in, FLT *out); +void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, struct survive_calibration_config *config, + const FLT *in, FLT *out); void survive_apply_bsd_calibration(SurviveContext *ctx, int lh, const FLT *in, FLT *out); #ifdef __cplusplus diff --git a/src/poser_epnp.c b/src/poser_epnp.c index c05450a..2cbd9c1 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -72,9 +72,9 @@ static int opencv_solver_fullscene(SurviveObject *so, PoserDataFullScene *pdfs) for (size_t i = 0; i < so->sensor_ct; i++) { FLT *lengths = pdfs->lengths[i][lh]; - FLT *_ang = pdfs->angles[i][lh]; - FLT ang[2]; - survive_apply_bsd_calibration(so->ctx, lh, _ang, ang); + FLT *ang = pdfs->angles[i][lh]; + // FLT ang[2]; + // survive_apply_bsd_calibration(so->ctx, lh, _ang, ang); if (lengths[0] < 0 || lengths[1] < 0) continue; diff --git a/src/poser_sba.c b/src/poser_sba.c index 4a4ed8f..49854f2 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -18,7 +18,6 @@ #include "survive_reproject.h" typedef struct { - survive_calibration_config calibration_config; PoserData *pdfs; SurviveObject *so; SurvivePose obj_pose; @@ -58,8 +57,8 @@ static void metric_function(int j, int i, double *aj, double *xij, void *adata) SurvivePose obj2world = ctx->obj_pose; FLT sensorInWorld[3] = {0}; ApplyPoseToPoint(sensorInWorld, &obj2world, &so->sensor_locations[i * 3]); - survive_reproject_from_pose_with_config(so->ctx, &ctx->calibration_config, j, (SurvivePose *)aj, sensorInWorld, - xij); + survive_calibration_config cfg = so->ctx->calibration_config; + survive_reproject_from_pose_with_config(so->ctx, &cfg, j, (SurvivePose *)aj, sensorInWorld, xij); } static size_t construct_input(const SurviveObject *so, PoserDataFullScene *pdfs, char *vmask, double *meas) { @@ -73,9 +72,9 @@ static size_t construct_input(const SurviveObject *so, PoserDataFullScene *pdfs, continue; } - double *_angles = pdfs->angles[sensor][lh]; - double angles[2]; - survive_apply_bsd_calibration(so->ctx, lh, _angles, angles); + double *angles = pdfs->angles[sensor][lh]; + // double angles[2]; + // survive_apply_bsd_calibration(so->ctx, lh, _angles, angles); vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; meas[measCount++] = angles[0]; @@ -93,9 +92,9 @@ static size_t construct_input_from_scene(SBAData *d, PoserDataLight *pdl, Surviv for (size_t sensor = 0; sensor < so->sensor_ct; sensor++) { for (size_t lh = 0; lh < 2; lh++) { if (SurviveSensorActivations_isPairValid(scene, d->sensor_time_window, pdl->timecode, sensor, lh)) { - double *_a = scene->angles[sensor][lh]; - FLT a[2]; - survive_apply_bsd_calibration(so->ctx, lh, _a, a); + const double *a = scene->angles[sensor][lh]; + // FLT a[2]; + // survive_apply_bsd_calibration(so->ctx, lh, _a, a); vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; if (cov) { @@ -160,7 +159,7 @@ static void str_metric_function_single_sweep(int j, int i, double *bi, double *x SurvivePose *camera = &so->ctx->bsd[lh].Pose; FLT out[2]; - survive_reproject_from_pose_with_config(so->ctx, &ctx->hdr.calibration_config, lh, camera, xyz, out); + survive_reproject_from_pose(so->ctx, lh, camera, xyz, out); *xij = out[acode]; } @@ -181,12 +180,11 @@ static void str_metric_function(int j, int i, double *bi, double *xij, void *ada // std::cerr << "Processing " << sensor_idx << ", " << lh << std::endl; SurvivePose *camera = &so->ctx->bsd[lh].Pose; - survive_reproject_from_pose_with_config(so->ctx, &ctx->calibration_config, lh, camera, xyz, xij); + survive_reproject_from_pose(so->ctx, lh, camera, xyz, xij); } -static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config options, PoserDataLight *pdl, - SurviveSensorActivations *scene, int max_iterations /* = 50*/, - double max_reproj_error /* = 0.005*/) { +static double run_sba_find_3d_structure(SBAData *d, PoserDataLight *pdl, SurviveSensorActivations *scene, + int max_iterations /* = 50*/, double max_reproj_error /* = 0.005*/) { double *covx = 0; SurviveObject *so = d->so; @@ -246,7 +244,7 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o double opts[SBA_OPTSSZ] = {0}; double info[SBA_INFOSZ] = {0}; - sba_context ctx = {options, &pdl->hdr, so}; + sba_context ctx = {&pdl->hdr, so}; opts[0] = SBA_INIT_MU; opts[1] = SBA_STOP_THRESH; @@ -300,15 +298,15 @@ static double run_sba_find_3d_structure(SBAData *d, survive_calibration_config o } // Optimizes for LH position assuming object is posed at 0 -static double run_sba(survive_calibration_config options, PoserDataFullScene *pdfs, SurviveObject *so, - int max_iterations /* = 50*/, double max_reproj_error /* = 0.005*/) { +static double run_sba(PoserDataFullScene *pdfs, SurviveObject *so, int max_iterations /* = 50*/, + double max_reproj_error /* = 0.005*/) { double *covx = 0; char *vmask = alloca(sizeof(char) * so->sensor_ct * NUM_LIGHTHOUSES); double *meas = alloca(sizeof(double) * 2 * so->sensor_ct * NUM_LIGHTHOUSES); size_t meas_size = construct_input(so, pdfs, vmask, meas); - sba_context sbactx = {options, &pdfs->hdr, so, .camera_params = {so->ctx->bsd[0].Pose, so->ctx->bsd[1].Pose}, + sba_context sbactx = {&pdfs->hdr, so, .camera_params = {so->ctx->bsd[0].Pose, so->ctx->bsd[1].Pose}, .obj_pose = so->OutPose}; { @@ -424,8 +422,7 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { // only process sweeps FLT error = -1; if (d->last_lh != lightData->lh || d->last_acode != lightData->acode) { - survive_calibration_config config = *survive_calibration_default_config(ctx); - error = run_sba_find_3d_structure(d, config, lightData, scene, 100, .5); + error = run_sba_find_3d_structure(d, lightData, scene, 100, .5); d->last_lh = lightData->lh; d->last_acode = lightData->acode; } @@ -443,9 +440,7 @@ int PoserSBA(SurviveObject *so, PoserData *pd) { case POSERDATA_FULL_SCENE: { SurviveContext *ctx = so->ctx; PoserDataFullScene *pdfs = (PoserDataFullScene *)(pd); - survive_calibration_config config = *survive_calibration_default_config(ctx); - SV_INFO("Running sba with %u", (int)survive_calibration_config_index(&config)); - double error = run_sba(config, pdfs, so, 100, .005); + double error = run_sba(pdfs, so, 100, .005); // std::cerr << "Average reproj error: " << error << std::endl; return 0; } diff --git a/src/survive.c b/src/survive.c index 63ad2ba..2a7aad1 100644 --- a/src/survive.c +++ b/src/survive.c @@ -219,7 +219,8 @@ SurviveContext *survive_init_internal(int argc, char *const *argv) { ctx->configfunction = survive_default_htc_config_process; ctx->rawposeproc = survive_default_raw_pose_process; - ctx->calibration_flag = (enum SurviveCalFlag)survive_configi(ctx, "bsd-cal", SC_GET, SVCal_All); + ctx->calibration_config = survive_calibration_config_ctor(); + ctx->calibration_config.use_flag = (enum SurviveCalFlag)survive_configi(ctx, "bsd-cal", SC_GET, SVCal_All); return ctx; } diff --git a/src/survive_cal.c b/src/survive_cal.c index e094e7b..3015b68 100755 --- a/src/survive_cal.c +++ b/src/survive_cal.c @@ -13,12 +13,13 @@ #include "survive_internal.h" #include "survive_reproject.h" +#include +#include #include +#include #include #include #include -#include -#include #include "survive_config.h" @@ -618,9 +619,8 @@ static void handle_calibration( struct SurviveCalData *cd ) } fsd.lengths[i][j][0] = cd->avglens[dataindex+0]; fsd.lengths[i][j][1] = cd->avglens[dataindex+1]; - // fsd.angles[i][j][0] = cd->avgsweeps[dataindex+0]; - // fsd.angles[i][j][1] = cd->avgsweeps[dataindex+1]; - survive_apply_bsd_calibration(ctx, lh, &cd->avgsweeps[dataindex], fsd.angles[i][j]); + fsd.angles[i][j][0] = cd->avgsweeps[dataindex + 0]; + fsd.angles[i][j][1] = cd->avgsweeps[dataindex + 1]; fsd.synctimes[i][j] = temp_syncs[i][j]; } diff --git a/src/survive_reproject.c b/src/survive_reproject.c index 845f30a..ee9704f 100644 --- a/src/survive_reproject.c +++ b/src/survive_reproject.c @@ -4,75 +4,6 @@ #include #include -static void survive_calibration_options_config_normalize( - survive_calibration_options_config *option) { - if (!option->enable[0]) - option->invert[0] = false; - if (!option->enable[1]) - option->invert[1] = false; - if (!option->enable[0] && !option->enable[1]) - option->swap = false; -} - -void survive_calibration_options_config_apply( - const survive_calibration_options_config *option, const FLT *input, - FLT *output) { - FLT tmp[2]; // In case they try to do in place - for (int i = 0; i < 2; i++) { - tmp[i] = option->enable[i] * (option->invert[i] ? -1 : 1) * - input[i ^ option->swap]; - } - for (int i = 0; i < 2; i++) { - output[i] = tmp[i]; - } -} - -survive_calibration_config -survive_calibration_config_create_from_idx(size_t v) { - survive_calibration_config config; - memset(&config, 0, sizeof(config)); - - bool *_this = (bool *)&config; - - for (size_t i = 0; i < sizeof(config); i++) { - _this[i] = (bool)(v & 1); - v = v >> 1; - } - - survive_calibration_options_config_normalize(&config.phase); - survive_calibration_options_config_normalize(&config.tilt); - survive_calibration_options_config_normalize(&config.curve); - survive_calibration_options_config_normalize(&config.gibMag); - - config.gibPhase.enable[0] = config.gibMag.enable[0]; - config.gibPhase.enable[1] = config.gibMag.enable[1]; - - survive_calibration_options_config_normalize(&config.gibPhase); - - if (!config.gibPhase.enable[0] && !config.gibPhase.enable[1]) - config.gibUseSin = false; - - return config; -} - -size_t -survive_calibration_config_index(const survive_calibration_config *config) { - bool *_this = (bool *)config; - size_t v = 0; - for (size_t i = 0; i < sizeof(*config); i++) { - v = (v | _this[sizeof(*config) - i - 1]); - v = v << 1; - } - v = v >> 1; - return v; -} - -static FLT gibf(bool useSin, FLT v) { - if (useSin) - return sin(v); - return cos(v); -} - void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const survive_calibration_config *config, const SurvivePose *pose, const FLT *pt, FLT *out) { LinmathQuat invq; @@ -89,116 +20,43 @@ void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const surv FLT x = -t_pt[0] / -t_pt[2]; FLT y = t_pt[1] / -t_pt[2]; - double ang_x = atan(x); - double ang_y = atan(y); - - double phase[2]; - survive_calibration_options_config_apply(&config->phase, bsd->fcal.phase, phase); - double tilt[2]; - survive_calibration_options_config_apply(&config->tilt, bsd->fcal.tilt, tilt); - double curve[2]; - survive_calibration_options_config_apply(&config->curve, bsd->fcal.curve, curve); - double gibPhase[2]; - survive_calibration_options_config_apply(&config->gibPhase, bsd->fcal.gibpha, gibPhase); - double gibMag[2]; - survive_calibration_options_config_apply(&config->gibMag, bsd->fcal.gibmag, gibMag); - - out[0] = ang_x + phase[0] + (tilt[0]) * ang_y + curve[0] * ang_y * ang_y + - gibf(config->gibUseSin, gibPhase[0] + ang_x) * gibMag[0]; - out[1] = ang_y + phase[1] + (tilt[1]) * ang_x + curve[1] * ang_x * ang_x + - gibf(config->gibUseSin, gibPhase[1] + ang_y) * gibMag[1]; -} -void survive_reproject_from_pose_with_config(const SurviveContext *ctx, const survive_calibration_config *config, - int lighthouse, const SurvivePose *pose, const FLT *pt, FLT *out) { - const BaseStationData *bsd = &ctx->bsd[lighthouse]; - survive_reproject_from_pose_with_bsd(bsd, config, pose, pt, out); -} - -void survive_reproject_with_config(const SurviveContext *ctx, const survive_calibration_config *config, int lighthouse, - const FLT *point3d, FLT *out) { - survive_reproject_from_pose_with_config(ctx, config, lighthouse, &ctx->bsd[lighthouse].Pose, point3d, out); -} - -void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, - const SurvivePose *pose, FLT *pt, FLT *out) { - survive_reproject_from_pose_with_config(ctx, survive_calibration_default_config(ctx), lighthouse, pose, pt, out); -} + double ang[] = {atan(x), atan(y)}; -void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, - FLT *out) { - survive_reproject_from_pose(ctx, lighthouse, &ctx->bsd[lighthouse].Pose, - point3d, out); -} + const FLT *phase = bsd->fcal.phase; + const FLT *curve = bsd->fcal.curve; + const FLT *tilt = bsd->fcal.tilt; + const FLT *gibPhase = bsd->fcal.gibpha; + const FLT *gibMag = bsd->fcal.gibmag; + enum SurviveCalFlag f = config->use_flag; -const survive_calibration_config *survive_calibration_default_config(const SurviveContext *_ctx) { - SurviveContext *ctx = (SurviveContext *)_ctx; - if (ctx->calibration_config == 0) { - size_t idx = survive_configi(ctx, "default-cal-conf", SC_GET, 0); - ctx->calibration_config = malloc(sizeof(survive_calibration_config)); - memset(ctx->calibration_config, 0, sizeof(survive_calibration_config)); - *ctx->calibration_config = survive_calibration_config_create_from_idx(idx); - } - return ctx->calibration_config; -} + for (int axis = 0; axis < 2; axis++) { + int opp_axis = axis == 0 ? 1 : 0; -size_t survive_calibration_config_max_idx() { - survive_calibration_config cfg; - memset(&cfg, 0x1, sizeof(survive_calibration_config)); - return survive_calibration_config_index(&cfg); -} + out[axis] = ang[axis]; -static void survive_calibration_options_config_fprint(FILE *file, const survive_calibration_options_config *self) { - fprintf(file, "\t"); - if (!self->enable[0] && !self->enable[1]) { - fprintf(file, "disabled"); - return; + if (f & SVCal_Phase) + out[axis] -= config->phase_scale * phase[axis]; + if (f & SVCal_Tilt) + out[axis] -= (config->tilt_scale * tilt[axis]) * ang[opp_axis]; + if (f & SVCal_Curve) + out[axis] -= config->curve_scale * curve[axis] * ang[opp_axis] * ang[opp_axis]; + if (f & SVCal_Gib) + out[axis] -= config->gib_scale * sin(gibPhase[axis] + ang[axis]) * gibMag[axis]; } - fprintf(file, "swap: %d\n", self->swap); - for (int i = 0; i < 2; i++) { - if (self->enable[i]) { - fprintf(file, "\tinvert[%d]: %d", i, self->invert[i]); - } else { - fprintf(file, "\t%d: disabled", i); - } - } } -void survive_calibration_config_fprint(FILE *file, const survive_calibration_config *self) { - fprintf(file, "Index: %ld\n", survive_calibration_config_index(self)); - - fprintf(file, "Phase: \n"); - survive_calibration_options_config_fprint(file, &self->phase); - fprintf(file, "\n"); - - fprintf(file, "Tilt: \n"); - survive_calibration_options_config_fprint(file, &self->tilt); - fprintf(file, "\n"); - - fprintf(file, "Curve: \n"); - survive_calibration_options_config_fprint(file, &self->curve); - fprintf(file, "\n"); - - fprintf(file, "gibPhase: \n"); - survive_calibration_options_config_fprint(file, &self->gibPhase); - fprintf(file, "\n"); - - fprintf(file, "gibMag: \n"); - survive_calibration_options_config_fprint(file, &self->gibMag); - fprintf(file, "\n"); - - fprintf(file, "gibUseSin: %d\n", self->gibUseSin); -} - -void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, enum SurviveCalFlag f, const FLT *in, - FLT *out) { +void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, struct survive_calibration_config *config, + const FLT *in, FLT *out) { const BaseStationCal *cal = &ctx->bsd[lh].fcal; - out[0] = in[0] + cal->phase[0]; - out[1] = in[1] + cal->phase[1]; - - FLT tilt_scale = 10; - FLT curve_scale = 10000; - FLT gib_scale = 10; + out[0] = in[0] + config->phase_scale * cal->phase[0]; + out[1] = in[1] + config->phase_scale * cal->phase[1]; + + enum SurviveCalFlag f = config->use_flag; + FLT phase_scale = config->phase_scale; + FLT tilt_scale = config->tilt_scale; + FLT curve_scale = config->curve_scale; + FLT gib_scale = config->gib_scale; const int iterations = 4; for (int i = 0; i < iterations; i++) { FLT last_out[2] = {out[0], out[1]}; @@ -207,17 +65,39 @@ void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, enum Sur int oj = j == 0 ? 1 : 0; out[j] = in[j]; if (!last_iteration || (f & SVCal_Phase)) - out[j] += (cal->phase[j]); + out[j] += phase_scale * cal->phase[j]; if (!last_iteration || (f & SVCal_Tilt)) - out[j] += tan(cal->tilt[j] / tilt_scale) * last_out[oj]; + out[j] += (tilt_scale * cal->tilt[j]) * last_out[oj]; if (!last_iteration || (f & SVCal_Curve)) - out[j] += (cal->curve[j] / curve_scale) * last_out[oj] * last_out[oj]; + out[j] += (cal->curve[j] * curve_scale) * last_out[oj] * last_out[oj]; if (!last_iteration || (f & SVCal_Gib)) - out[j] += cos(cal->gibpha[j] + last_out[j]) * cal->gibmag[1] / gib_scale; + out[j] += sin(cal->gibpha[j] + last_out[j]) * cal->gibmag[j] * gib_scale; } } } +void survive_reproject_from_pose(const SurviveContext *ctx, int lighthouse, const SurvivePose *pose, FLT *pt, + FLT *out) { + survive_reproject_from_pose_with_bsd(&ctx->bsd[lighthouse], &ctx->calibration_config, pose, pt, out); +} + +void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, FLT *out) { + survive_reproject_from_pose(ctx, lighthouse, &ctx->bsd[lighthouse].Pose, point3d, out); +} + +survive_calibration_config survive_calibration_config_ctor() { + return (survive_calibration_config){.use_flag = SVCal_All, + .phase_scale = 1., + .tilt_scale = 1. / 10000., + .curve_scale = 1. / 1000., + .gib_scale = -1. / 10.}; +} + void survive_apply_bsd_calibration(SurviveContext *ctx, int lh, const FLT *in, FLT *out) { - survive_apply_bsd_calibration_by_flag(ctx, lh, ctx->calibration_flag, in, out); + survive_apply_bsd_calibration_by_flag(ctx, lh, &ctx->calibration_config, in, out); +} + +void survive_reproject_from_pose_with_config(const SurviveContext *ctx, struct survive_calibration_config *config, + int lighthouse, const SurvivePose *pose, FLT *point3d, FLT *out) { + return survive_reproject_from_pose_with_bsd(&ctx->bsd[lighthouse], config, pose, point3d, out); } diff --git a/tools/findoptimalconfig/findoptimalconfig.cc b/tools/findoptimalconfig/findoptimalconfig.cc index 874ed84..88a43eb 100644 --- a/tools/findoptimalconfig/findoptimalconfig.cc +++ b/tools/findoptimalconfig/findoptimalconfig.cc @@ -11,35 +11,6 @@ #include #include -std::ostream &operator<<(std::ostream &o, const survive_calibration_options_config &self) { - o << "\t"; - if (!self.enable[0] && !self.enable[1]) { - o << "disabled"; - return o; - } - - o << "swap: " << self.swap << std::endl; - for (int i = 0; i < 2; i++) { - if (self.enable[i]) { - o << "\tinvert[" << i << "]: " << self.invert[i]; - } else { - o << "\t" << i << ": disabled"; - } - } - return o; -} - -std::ostream &operator<<(std::ostream &o, const survive_calibration_config &self) { - o << "Index: " << survive_calibration_config_index(&self) << std::endl; - o << "Phase: " << std::endl << self.phase << std::endl; - o << "Tilt: " << std::endl << self.tilt << std::endl; - o << "Curve: " << std::endl << self.curve << std::endl; - o << "gibPhase: " << std::endl << self.gibPhase << std::endl; - o << "gibMag: " << std::endl << self.gibMag << std::endl; - o << "gibUseSin: " << self.gibUseSin << std::endl; - return o; -} - struct SBAData { int last_acode = -1; int last_lh = -1; @@ -279,9 +250,7 @@ double find_optimal_cal(SurviveContext *ctx, const survive_calibration_config &c double opts[SBA_OPTSSZ] = {0}; double info[SBA_INFOSZ] = {0}; - BaseStationCal cal[2] = {}; - - opts[0] = SBA_INIT_MU; + survive_calibration_config opts[0] = SBA_INIT_MU; opts[1] = SBA_STOP_THRESH; opts[2] = SBA_STOP_THRESH; opts[3] = SBA_STOP_THRESH; @@ -402,49 +371,12 @@ int main(int argc, char **argv) { while (survive_poll(ctx) == 0) { } - survive_calibration_config config = {}; - // config.tilt.enable[0] = config.tilt.enable[1] = 1; - // config.curve.enable[0] = config.curve.enable[1] = 1; - config.phase.enable[0] = config.phase.enable[1] = 1; - // config.gibPhase.enable[0] = config.gibPhase.enable[1] = 1; - // config.gibMag.enable[0] = config.gibMag.enable[1] = 1; + survive_calibration_config config = survive_calibration_config_ctor(); find_optimal_cal(ctx, config, data); - for (int j = 0; j < sections.size(); j++) { - auto &range = sections[j]; - for (size_t _i = 0; _i < (1 << range.first); _i++) { - int i = (_i << range.second); - survive_calibration_config config = survive_calibration_config_create_from_idx(i); - if (i == survive_calibration_config_index(&config)) { - double error = find_avg_reproj_error(ctx, config, data); - errors[j][i] += error; - } - } - std::cerr << "Finished grouping " << j << std::endl; - } - survive_close(ctx); } - for (int i = 0; i < errors.size(); i++) { - std::cout << "Grouping " << i << std::endl; - auto compFunctor = [](std::pair elem1, std::pair elem2) { - if (elem1.second == elem2.second) - return elem1.first < elem2.first; - return elem1.second < elem2.second; - }; - - std::set, typeof(compFunctor)> set(errors[i].begin(), errors[i].end(), compFunctor); - - for (auto err : set) { - survive_calibration_config config = survive_calibration_config_create_from_idx(err.first); - if (err.first == survive_calibration_config_index(&config)) { - double error = err.second; - std::cout << "Config " << err.first << " " << error << std::endl; - std::cout << config << std::endl; - } - } - } return 0; } -- cgit v1.2.3 From aea08a70a033cc0aef0998267fadb54af5fb2c69 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 1 Apr 2018 15:37:16 -0600 Subject: More optimization of scale params for calibration --- include/libsurvive/survive.h | 2 +- src/survive_reproject.c | 15 ++++---- tools/findoptimalconfig/findoptimalconfig.cc | 54 ++++++++++++++-------------- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/include/libsurvive/survive.h b/include/libsurvive/survive.h index 669821d..7248b1c 100644 --- a/include/libsurvive/survive.h +++ b/include/libsurvive/survive.h @@ -186,8 +186,8 @@ enum SurviveCalFlag { }; typedef struct survive_calibration_config { - enum SurviveCalFlag use_flag; FLT phase_scale, tilt_scale, curve_scale, gib_scale; + enum SurviveCalFlag use_flag; } survive_calibration_config; survive_calibration_config survive_calibration_config_ctor(); diff --git a/src/survive_reproject.c b/src/survive_reproject.c index ee9704f..751abc0 100644 --- a/src/survive_reproject.c +++ b/src/survive_reproject.c @@ -19,7 +19,7 @@ void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const surv FLT x = -t_pt[0] / -t_pt[2]; FLT y = t_pt[1] / -t_pt[2]; - + double xy[] = {x, y}; double ang[] = {atan(x), atan(y)}; const FLT *phase = bsd->fcal.phase; @@ -37,9 +37,9 @@ void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const surv if (f & SVCal_Phase) out[axis] -= config->phase_scale * phase[axis]; if (f & SVCal_Tilt) - out[axis] -= (config->tilt_scale * tilt[axis]) * ang[opp_axis]; + out[axis] -= tan(config->tilt_scale * tilt[axis]) * xy[opp_axis]; if (f & SVCal_Curve) - out[axis] -= config->curve_scale * curve[axis] * ang[opp_axis] * ang[opp_axis]; + out[axis] -= config->curve_scale * curve[axis] * xy[opp_axis] * xy[opp_axis]; if (f & SVCal_Gib) out[axis] -= config->gib_scale * sin(gibPhase[axis] + ang[axis]) * gibMag[axis]; } @@ -60,6 +60,7 @@ void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, struct s const int iterations = 4; for (int i = 0; i < iterations; i++) { FLT last_out[2] = {out[0], out[1]}; + FLT tlast_out[2] = {tan(out[0]), tan(out[1])}; bool last_iteration = i == iterations - 1; for (int j = 0; j < 2; j++) { int oj = j == 0 ? 1 : 0; @@ -67,9 +68,9 @@ void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, struct s if (!last_iteration || (f & SVCal_Phase)) out[j] += phase_scale * cal->phase[j]; if (!last_iteration || (f & SVCal_Tilt)) - out[j] += (tilt_scale * cal->tilt[j]) * last_out[oj]; + out[j] += tan(tilt_scale * cal->tilt[j]) * tlast_out[oj]; if (!last_iteration || (f & SVCal_Curve)) - out[j] += (cal->curve[j] * curve_scale) * last_out[oj] * last_out[oj]; + out[j] += (cal->curve[j] * curve_scale) * tlast_out[oj] * tlast_out[oj]; if (!last_iteration || (f & SVCal_Gib)) out[j] += sin(cal->gibpha[j] + last_out[j]) * cal->gibmag[j] * gib_scale; } @@ -88,8 +89,8 @@ void survive_reproject(const SurviveContext *ctx, int lighthouse, FLT *point3d, survive_calibration_config survive_calibration_config_ctor() { return (survive_calibration_config){.use_flag = SVCal_All, .phase_scale = 1., - .tilt_scale = 1. / 10000., - .curve_scale = 1. / 1000., + .tilt_scale = 1. / 10., + .curve_scale = 1. / 10., .gib_scale = -1. / 10.}; } diff --git a/tools/findoptimalconfig/findoptimalconfig.cc b/tools/findoptimalconfig/findoptimalconfig.cc index 88a43eb..b94590f 100644 --- a/tools/findoptimalconfig/findoptimalconfig.cc +++ b/tools/findoptimalconfig/findoptimalconfig.cc @@ -200,35 +200,36 @@ double sba_opt(SurviveContext *ctx, const survive_calibration_config &config, Pl struct optimal_cal_ctx { std::vector sensors; + std::vector lighthouses; SurviveContext *ctx; - survive_calibration_config config; }; static void metric_function(int j, int i, double *aj, double *xij, void *adata) { optimal_cal_ctx *ctx = (optimal_cal_ctx *)(adata); FLT sensorInWorld[3] = {ctx->sensors[i * 3 + 0], ctx->sensors[i * 3 + 1], ctx->sensors[i * 3 + 2]}; + int lh = ctx->lighthouses[i]; + BaseStationData bsd = ctx->ctx->bsd[lh]; + survive_calibration_config cfg = *(survive_calibration_config *)aj; - BaseStationData bsd = ctx->ctx->bsd[j]; - bsd.fcal = *(BaseStationCal *)aj; - - survive_reproject_from_pose_with_bsd(&bsd, &ctx->config, &ctx->ctx->bsd[j].Pose, sensorInWorld, xij); + survive_reproject_from_pose_with_bsd(&bsd, &cfg, &ctx->ctx->bsd[lh].Pose, sensorInWorld, xij); } -double find_optimal_cal(SurviveContext *ctx, const survive_calibration_config &config, PlaybackData &data) { +double find_optimal_cal(SurviveContext *ctx, PlaybackData &data) { optimal_cal_ctx _ctx; std::vector vmask; std::vector cov, meas; _ctx.ctx = ctx; - _ctx.config = config; for (auto &in : data.inputs) { for (size_t sensor = 0; sensor < in.so->sensor_ct; sensor++) { FLT p[3]; ApplyPoseToPoint(p, &in.position, &data.so->sensor_locations[sensor * 3]); - _ctx.sensors.emplace_back(p[0]); - _ctx.sensors.emplace_back(p[1]); - _ctx.sensors.emplace_back(p[2]); - for (size_t lh = 0; lh < 1; lh++) { + for (size_t lh = 0; lh < 2; lh++) { + _ctx.sensors.emplace_back(p[0]); + _ctx.sensors.emplace_back(p[1]); + _ctx.sensors.emplace_back(p[2]); + _ctx.lighthouses.emplace_back(lh); + auto scene = &in.activations; if (SurviveSensorActivations_isPairValid(scene, settings.sensor_time_window, in.timestamp, sensor, lh)) { @@ -250,22 +251,25 @@ double find_optimal_cal(SurviveContext *ctx, const survive_calibration_config &c double opts[SBA_OPTSSZ] = {0}; double info[SBA_INFOSZ] = {0}; - survive_calibration_config opts[0] = SBA_INIT_MU; + survive_calibration_config config = {0}; + config.use_flag = SVCal_All; + + opts[0] = SBA_INIT_MU; opts[1] = SBA_STOP_THRESH; opts[2] = SBA_STOP_THRESH; opts[3] = SBA_STOP_THRESH; opts[3] = SBA_STOP_THRESH; // max_reproj_error * meas.size(); opts[4] = 0.0; - int status = sba_mot_levmar(data.inputs.size() * so->sensor_ct, // number of 3d points - 1, // Number of cameras -- 2 lighthouses - 0, // Number of cameras to not modify - &vmask[0], // boolean vis mask - (double *)cal, // camera parameters - 2, // sizeof(BaseStationCal) / sizeof(FLT), - &meas[0], // 2d points for 3d objs - covx, // covariance of measurement. Null sets to identity - 2, // 2 points per image + int status = sba_mot_levmar(data.inputs.size() * so->sensor_ct * NUM_LIGHTHOUSES, // number of 3d points + 1, // Number of cameras -- 2 lighthouses + 0, // Number of cameras to not modify + &vmask[0], // boolean vis mask + (double *)&config, // camera parameters + 4, // sizeof(BaseStationCal) / sizeof(FLT), + &meas[0], // 2d points for 3d objs + covx, // covariance of measurement. Null sets to identity + 2, // 2 points per image metric_function, 0, // jacobia of metric_func &_ctx, // user data @@ -295,10 +299,6 @@ double find_optimal_cal(SurviveContext *ctx, const survive_calibration_config &c assert(!isinf(info[1])); std::cerr << "Used " << meas_size << " measurements" << std::endl; - double *_cal = (double *)cal; - for (int i = 0; i < sizeof(BaseStationCal) / sizeof(FLT); i++) - std::cerr << _cal[2 * i] << ", " << _cal[2 * i + 1] << " = " << (info[1] / meas_size * 2) << std::endl; - return info[1] / meas_size * 2; } double find_avg_reproj_error(SurviveContext *ctx, const survive_calibration_config &config, PlaybackDataInput &data) { @@ -371,9 +371,7 @@ int main(int argc, char **argv) { while (survive_poll(ctx) == 0) { } - survive_calibration_config config = survive_calibration_config_ctor(); - - find_optimal_cal(ctx, config, data); + find_optimal_cal(ctx, data); survive_close(ctx); } -- cgit v1.2.3 From 5384af65f9d63d095cb9987d36de57ccee323300 Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 1 Apr 2018 15:47:07 -0600 Subject: Added reproject tool --- tools/showreproject/Makefile | 16 +++ tools/showreproject/showreproject.cc | 271 +++++++++++++++++++++++++++++++++++ 2 files changed, 287 insertions(+) create mode 100644 tools/showreproject/Makefile create mode 100644 tools/showreproject/showreproject.cc diff --git a/tools/showreproject/Makefile b/tools/showreproject/Makefile new file mode 100644 index 0000000..f6d5925 --- /dev/null +++ b/tools/showreproject/Makefile @@ -0,0 +1,16 @@ +all : showreproject + +SRT:=../.. + +LIBSURVIVE:=$(SRT)/lib/libsurvive.so + +CFLAGS:=-I$(SRT)/redist -I$(SRT)/include -O0 -g -DFLT=double -DUSE_DOUBLE #-fsanitize=address -fsanitize=undefined +LDFLAGS:=-lm -lpthread -llapacke -lcblas -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs + +showreproject : showreproject.cc $(LIBSURVIVE) + cd ../..;make + g++ $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean : + rm -rf showreproject + diff --git a/tools/showreproject/showreproject.cc b/tools/showreproject/showreproject.cc new file mode 100644 index 0000000..89d67c4 --- /dev/null +++ b/tools/showreproject/showreproject.cc @@ -0,0 +1,271 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "opencv2/imgproc.hpp" +#include +#include + +uint32_t timestamp; + +cv::Mat_ img; +cv::Mat_ err[2]; + +cv::Vec3f flow2rgb(float x, float y, float scale = 1) { + cv::Mat_ hsv(1, 1); + hsv(0, 0) = {atan2(y, x) * 180. / M_PI, 1.0, std::min(1.0f, sqrt(x * x + y * y) * scale)}; + cv::Mat_ bgr(1, 1); + cv::cvtColor(hsv, bgr, CV_HSV2RGB_FULL); + return bgr(0, 0) * 255; +} + +static void draw_viz(cv::Mat &img, double scale = 1) { + double size = 50; + cv::Point2f origin(size, size); + for (double r = size; r > size / 100.; r -= size / 100.) { + for (double theta = 0; theta < 2 * M_PI; theta += .01) { + auto x = cos(theta) * r; + auto y = sin(theta) * r; + auto clr = flow2rgb(x, y, scale / size); + cv::line(img, cv::Point2f(x, y) + origin, origin, clr); + } + } +} + +double error = 0; +int error_count = 0; + +static void redraw(SurviveContext *ctx) { + int SIZE = 1000; + int shift = ctx->user_ptr ? 1 : 0; + + auto show_pov = 130. / 180; + auto fov = 120. / 180. * SIZE / show_pov; + + auto map = [&](const double *a) { + auto x = a[0] * SIZE / (M_PI) / show_pov + SIZE / 2; + return cv::Point(x, SIZE - (a[1] * SIZE / (M_PI) + SIZE / 2)); + }; + + auto region = img.data ? img(cv::Rect(SIZE * shift, 0, SIZE, SIZE)) : cv::Mat_(); + + if (region.data) { + + region.setTo(cv::Vec3b(0, 0, 0)); + cv::rectangle(region, cv::Point(SIZE / 2 - fov / 2, SIZE / 2 - fov / 2), + cv::Point(SIZE / 2 + fov / 2, SIZE / 2 + fov / 2), cv::Vec3b(255, 255, 255)); + } + + // eregion.copyTo(region); + + for (int i = 0; i < ctx->objs_ct; i++) { + auto so = ctx->objs[i]; + auto scene = &so->activations; + for (size_t lh = 0; lh < 2; lh++) { + auto eregion = err[lh](cv::Rect(SIZE * shift, 0, SIZE, SIZE)); + + for (size_t sensor = 0; sensor < so->sensor_ct; sensor++) { + + auto ncolor = cv::Vec3b(lh == 0 ? 255 : 0, + 255, // sensor / (double)so->sensor_ct * 255, + i / (double)ctx->objs_ct * 255); + auto rcolor = cv::Vec3b(lh == 0 ? 255 : 0, + 128, // sensor / (double)so->sensor_ct * 255, + i / (double)ctx->objs_ct * 255); + + if (SurviveSensorActivations_isPairValid(scene, SurviveSensorActivations_default_tolerance, timestamp, + sensor, lh)) { + const double *a = scene->angles[sensor][lh]; + // FLT a[2]; + // survive_apply_bsd_calibration(so->ctx, lh, _a, a); + + auto l = scene->lengths[sensor][lh]; + double r = std::max(1., (l[0] + l[1]) / 1000.); + // std::cerr << lh << "\t" << sensor << "\t" << ((l[0] + l[1]) / 2000.) << "\t" << l[0] << "\t" << + // l[1] << std::endl; + if (region.data) + cv::circle(region, map(a), r, ncolor); + + FLT point3d[3]; + FLT out[2]; + ApplyPoseToPoint(point3d, &so->OutPose, so->sensor_locations + 3 * sensor); + survive_reproject(ctx, lh, point3d, out); + + double ex = out[0] - a[0]; + double ey = out[1] - a[1]; + double err_add = sqrt(ex * ex + ey * ey); + error += err_add; + error_count++; + + auto &e = eregion(map(a).y, map(a).x); + e = flow2rgb(ex, ey, 100); + + cv::putText(img, std::to_string(error / error_count), cv::Point2f(10, 20), CV_FONT_HERSHEY_PLAIN, 1, + cv::Scalar(255, 255, 255)); + + if (region.data) { + cv::line(region, map(a) + cv::Point(ex * 10000, -ey * 10000), map(a), + cv::Scalar(255, 255, 255)); + cv::rectangle(region, map(out) - cv::Point(r, r), map(out) + cv::Point(r, r), rcolor); + } + } + } + }; + } + if (img.data) { + cv::imshow("Reprojection", img); + } +} + +void light_process(SurviveObject *so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length, + uint32_t lighthouse) { + timestamp = timecode; + survive_default_light_process(so, sensor_id, acode, timeinsweep, timecode, length, lighthouse); +} + +SurvivePose lastPose = {}; + +void raw_pose_process(SurviveObject *so, uint8_t lighthouse, SurvivePose *pose) { + survive_default_raw_pose_process(so, lighthouse, pose); + auto d = dist3d(lastPose.Pos, pose->Pos); + // std::cerr << d << std::endl; + if (d < .01) { + redraw(so->ctx); + } + lastPose = *pose; +} + +void lighthouse_process(SurviveContext *ctx, uint8_t lighthouse, SurvivePose *pose, SurvivePose *obj_pose) { + survive_default_lighthouse_pose_process(ctx, lighthouse, pose, obj_pose); +} + +SurviveContext *create(int argc, char **argv) { + auto ctx = survive_init(argc, argv); + + survive_install_raw_pose_fn(ctx, raw_pose_process); + survive_install_lighthouse_pose_fn(ctx, lighthouse_process); + survive_install_light_fn(ctx, light_process); + + return ctx; +} + +void drawbsds(SurviveContext *ctx) { + int SIZE = 1000; + + std::vector show_flags = { + SVCal_All, SVCal_Phase, SVCal_Gib, SVCal_Curve, SVCal_Tilt, + }; + + for (auto f : show_flags) { + for (int lh = 0; lh < 2; lh++) { + cv::Mat_ img = cv::Mat_(SIZE, SIZE); + img.setTo(cv::Vec3b(0, 0, 0)); + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + FLT in[2] = {x * M_PI / SIZE - M_PI / 2., y * M_PI / SIZE - M_PI / 2.}; + if (fabs(in[0]) > 60. / 180 * M_PI || fabs(in[1]) > 60. / 180 * M_PI) + continue; + + FLT out[2]; + auto config = survive_calibration_config_ctor(); + config.use_flag = f; + survive_apply_bsd_calibration_by_flag(ctx, lh, &config, in, out); + double ex = out[0] - in[0]; + double ey = out[1] - in[1]; + if (f == SVCal_All) { + ex -= ctx->bsd[lh].fcal.phase[0]; + ey -= ctx->bsd[lh].fcal.phase[1]; + } + + // Make it opposite of angles + ex *= -1; + ey *= -1; + + img(y, x) = flow2rgb(ex, ey, 100); + } + } + draw_viz(img); + cv::imwrite("BSD" + std::to_string(lh) + "_" + std::to_string(f) + ".png", img); + if (f == SVCal_All) + cv::imshow("BSD" + std::to_string(lh), img); + } + } +} + +int main(int argc, char **argv) { + // for (int i = 0; i < 1 << 5; i++) { + // size_t cidx = 15 | (i << 5); + + // auto conf = survive_calibration_config_create_from_idx(cidx); + // if (survive_calibration_config_index(&conf) != cidx) + // continue; + + auto ctx1 = create(argc, argv); + size_t cidx = survive_configi(ctx1, "default-cal-conf", SC_GET, 0); + size_t idx = survive_configi(ctx1, "default-cal-conf2", SC_GET, 0); + + SurviveContext *ctx2 = 0; + int numCtx = 1; + int ctx2_flag = 1; + if (idx != 0) { + numCtx++; + ctx2 = create(argc, argv); + ctx2->user_ptr = (void *)&ctx2_flag; + } + + size_t showui = survive_configi(ctx1, "show-ui", SC_GET, 0); + + drawbsds(ctx1); + + int waitUpdate = 100; + int SIZE = 1000; + if (showui) { + img = cv::Mat_(SIZE, numCtx * SIZE); + img.setTo(cv::Vec3b(0, 0, 0)); + } + for (int lh = 0; lh < 2; lh++) { + err[lh] = cv::Mat_(SIZE, numCtx * SIZE); + err[lh].setTo(cv::Vec3b(0, 0, 0)); + } + + if (img.data && false) { + cv::imshow("Reprojection", img); + cv::waitKey(0); + } + + auto start = std::chrono::high_resolution_clock::now(); + while (survive_poll(ctx1) == 0 && (ctx2 == 0 || survive_poll(ctx2) == 0)) { + auto now = std::chrono::high_resolution_clock::now(); + if ((now - start) > std::chrono::milliseconds(33)) { + cv::waitKey(1); + start = now; + } + } + + for (int i = 0; i < 2; i++) { + draw_viz(err[i]); + cv::putText(err[i], std::to_string(error / error_count), cv::Point2f(100, 20), CV_FONT_HERSHEY_PLAIN, 1, + cv::Scalar(255, 255, 255)); + cv::putText(err[i], std::to_string(cidx), cv::Point2f(100, 40), CV_FONT_HERSHEY_PLAIN, 1, + cv::Scalar(255, 255, 255)); + + auto name = "LH" + std::to_string(i); + cv::imwrite(name + "_" + std::to_string(cidx) + ".png", err[i]); + cv::imshow(name, err[i]); + } + + std::cerr << "Error: " << error / error_count << std::endl; + + int c = '\0'; + while (((c = cv::waitKey(0)) & 0xff) != 'q') { + std::cerr << (uint8_t)c << std::endl; + } + return 0; +} -- cgit v1.2.3 From 1724abef15a4090640bd82ba408681438316de7e Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Sun, 1 Apr 2018 16:04:05 -0600 Subject: Made calibration on other posers use calibration data --- .gitignore | 1 + include/libsurvive/survive_reproject.h | 14 +++++++++++--- src/poser_charlesslow.c | 28 +++++++++++++++++++--------- src/poser_daveortho.c | 17 ++++++++++------- src/poser_epnp.c | 6 +++--- src/poser_sba.c | 2 -- src/poser_turveytori.c | 18 ++++++++++++++---- src/survive_reproject.c | 6 +++--- tools/showreproject/showreproject.cc | 2 +- 9 files changed, 62 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 8cfd2be..f39d866 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ simple_pose_test *.csv calinfo/ *.log +*.png # Windows specific *.dll diff --git a/include/libsurvive/survive_reproject.h b/include/libsurvive/survive_reproject.h index 6546e66..e4f21d0 100644 --- a/include/libsurvive/survive_reproject.h +++ b/include/libsurvive/survive_reproject.h @@ -17,8 +17,9 @@ void survive_reproject_from_pose_with_config(const SurviveContext *ctx, struct s int lighthouse, const SurvivePose *pose, FLT *point3d, FLT *out); // This is given a lighthouse -- in the same system as stored in BaseStationData, and -// a 3d point and finds what the effective 'angle' value for a given lighthouse syste +// a 3d point and finds what the effective 'angle' value for a given lighthouse system // would be. +// // While this is typically opposite of what we want to do -- we want to find the 3d // position from a 2D coordinate, this is helpful since the minimization of reprojection // error is a core mechanism to many types of solvers. @@ -26,10 +27,17 @@ void survive_reproject_from_pose_with_config(const SurviveContext *ctx, struct s void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const survive_calibration_config *config, const SurvivePose *pose, const FLT *point3d, FLT *out); -void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, struct survive_calibration_config *config, - const FLT *in, FLT *out); +// This is given input from the light sensors and approximates the idealized version of them +// by incorporating the calibration data from the lighthouse. In theory, it's an approximation +// but in practice in converges pretty quickly and to a good degree of accuracy. +// That said, all things being equal, it is better to compare reprojection to raw incoming +// data if you are looking to minimize that error. void survive_apply_bsd_calibration(SurviveContext *ctx, int lh, const FLT *in, FLT *out); +// Same as above, but lets you specify the configuration. Used internally and also in some tools +void survive_apply_bsd_calibration_by_config(SurviveContext *ctx, int lh, struct survive_calibration_config *config, + const FLT *in, FLT *out); + #ifdef __cplusplus } #endif diff --git a/src/poser_charlesslow.c b/src/poser_charlesslow.c index bc6683a..b44225e 100644 --- a/src/poser_charlesslow.c +++ b/src/poser_charlesslow.c @@ -1,12 +1,13 @@ +#include "linmath.h" #include "survive_cal.h" +#include +#include #include -#include -#include "linmath.h" -#include #include #include -#include -#include +#include +#include +#include typedef struct { @@ -255,9 +256,13 @@ static FLT RunOpti( SurviveObject * hmd, PoserDataFullScene * fs, int lh, int pr int dataindex = p*(2*NUM_LIGHTHOUSES)+lh*2; if( fs->lengths[p][lh][0] < 0 || fs->lengths[p][lh][1] < 0 ) continue; + FLT out[2] = {}; + survive_apply_bsd_calibration(hmd->ctx, lh, fs->angles[p][lh], out); + //Find out where our ray shoots forth from. - FLT ax = fs->angles[p][lh][0]; - FLT ay = fs->angles[p][lh][1]; + FLT ax = out[0]; + FLT ay = out[1]; + //NOTE: Inputs may never be output with cross product. //Create a fictitious normalized ray. Imagine the lighthouse is pointed //straight in the +z direction, this is the lighthouse ray to the point. @@ -338,8 +343,13 @@ static FLT RunOpti( SurviveObject * hmd, PoserDataFullScene * fs, int lh, int pr if( fs->lengths[p][lh][0] < 0 || fs->lengths[p][lh][1] < 0 ) continue; //Find out where our ray shoots forth from. - FLT ax = fs->angles[p][lh][0]; - FLT ay = fs->angles[p][lh][1]; + FLT out[2] = {}; + survive_apply_bsd_calibration(hmd->ctx, lh, fs->angles[p][lh], out); + + // Find out where our ray shoots forth from. + FLT ax = out[0]; + FLT ay = out[1]; + FLT RayShootOut[3] = { sin(ax), sin(ay), 0 }; RayShootOut[2] = sqrt( 1 - (RayShootOut[0]*RayShootOut[0] + RayShootOut[1]*RayShootOut[1]) ); diff --git a/src/poser_daveortho.c b/src/poser_daveortho.c index c47bceb..9cdab45 100644 --- a/src/poser_daveortho.c +++ b/src/poser_daveortho.c @@ -1,12 +1,13 @@ +#include "linmath.h" #include "survive_cal.h" +#include +#include #include -#include -#include "linmath.h" -#include #include #include -#include -#include +#include +#include +#include // Dave talks about this poser here: https://www.youtube.com/watch?v=nSbEltdH9vM&feature=youtu.be&t=2h29m47s @@ -139,8 +140,10 @@ int PoserDaveOrtho( SurviveObject * so, PoserData * pd ) //Load all our valid points into something the LHFinder can use. if( fs->lengths[i][LH_ID][0] > 0 ) { - S_in[0][max_hits] = fs->angles[i][LH_ID][0]; - S_in[1][max_hits] = fs->angles[i][LH_ID][1]; + FLT out[2]; + survive_apply_bsd_calibration(ctx, LH_ID, fs->angles[i][LH_ID], out); + S_in[0][max_hits] = out[0]; + S_in[1][max_hits] = out[1]; X_in[0][max_hits] = so->sensor_locations[i*3+0]; X_in[1][max_hits] = so->sensor_locations[i*3+1]; X_in[2][max_hits] = so->sensor_locations[i*3+2]; diff --git a/src/poser_epnp.c b/src/poser_epnp.c index 2cbd9c1..c05450a 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -72,9 +72,9 @@ static int opencv_solver_fullscene(SurviveObject *so, PoserDataFullScene *pdfs) for (size_t i = 0; i < so->sensor_ct; i++) { FLT *lengths = pdfs->lengths[i][lh]; - FLT *ang = pdfs->angles[i][lh]; - // FLT ang[2]; - // survive_apply_bsd_calibration(so->ctx, lh, _ang, ang); + FLT *_ang = pdfs->angles[i][lh]; + FLT ang[2]; + survive_apply_bsd_calibration(so->ctx, lh, _ang, ang); if (lengths[0] < 0 || lengths[1] < 0) continue; diff --git a/src/poser_sba.c b/src/poser_sba.c index 49854f2..bd7d520 100644 --- a/src/poser_sba.c +++ b/src/poser_sba.c @@ -73,8 +73,6 @@ static size_t construct_input(const SurviveObject *so, PoserDataFullScene *pdfs, } double *angles = pdfs->angles[sensor][lh]; - // double angles[2]; - // survive_apply_bsd_calibration(so->ctx, lh, _angles, angles); vmask[sensor * NUM_LIGHTHOUSES + lh] = 1; meas[measCount++] = angles[0]; diff --git a/src/poser_turveytori.c b/src/poser_turveytori.c index 035fca7..4628207 100644 --- a/src/poser_turveytori.c +++ b/src/poser_turveytori.c @@ -13,6 +13,8 @@ #include #else #include //for alloca +#include + #endif @@ -1786,8 +1788,12 @@ int PoserTurveyTori( SurviveObject * so, PoserData * poserData ) to->sensor[sensorCount].point.x = point[0]; to->sensor[sensorCount].point.y = point[1]; to->sensor[sensorCount].point.z = point[2]; - to->sensor[sensorCount].theta = fs->angles[i][0][0] + LINMATHPI / 2; // lighthouse 0, angle 0 (horizontal) - to->sensor[sensorCount].phi = fs->angles[i][0][1] + LINMATHPI / 2; // lighthouse 0, angle 1 (vertical) + + FLT out[2]; + survive_apply_bsd_calibration(ctx, 0, fs->angles[i][0], out); + + to->sensor[sensorCount].theta = out[0] + LINMATHPI / 2; // lighthouse 0, angle 0 (horizontal) + to->sensor[sensorCount].phi = out[1] + LINMATHPI / 2; // lighthouse 0, angle 1 (vertical) sensorCount++; } @@ -1822,8 +1828,12 @@ int PoserTurveyTori( SurviveObject * so, PoserData * poserData ) to->sensor[sensorCount].point.x = point[0]; to->sensor[sensorCount].point.y = point[1]; to->sensor[sensorCount].point.z = point[2]; - to->sensor[sensorCount].theta = fs->angles[i][lh][0] + LINMATHPI / 2; // lighthouse 0, angle 0 (horizontal) - to->sensor[sensorCount].phi = fs->angles[i][lh][1] + LINMATHPI / 2; // lighthosue 0, angle 1 (vertical) + + FLT out[2]; + survive_apply_bsd_calibration(ctx, lh, fs->angles[i][lh], out); + + to->sensor[sensorCount].theta = out[0] + LINMATHPI / 2; // lighthouse 0, angle 0 (horizontal) + to->sensor[sensorCount].phi = out[1] + LINMATHPI / 2; // lighthosue 0, angle 1 (vertical) sensorCount++; } } diff --git a/src/survive_reproject.c b/src/survive_reproject.c index 751abc0..0eaceb2 100644 --- a/src/survive_reproject.c +++ b/src/survive_reproject.c @@ -46,8 +46,8 @@ void survive_reproject_from_pose_with_bsd(const BaseStationData *bsd, const surv } -void survive_apply_bsd_calibration_by_flag(SurviveContext *ctx, int lh, struct survive_calibration_config *config, - const FLT *in, FLT *out) { +void survive_apply_bsd_calibration_by_config(SurviveContext *ctx, int lh, struct survive_calibration_config *config, + const FLT *in, FLT *out) { const BaseStationCal *cal = &ctx->bsd[lh].fcal; out[0] = in[0] + config->phase_scale * cal->phase[0]; out[1] = in[1] + config->phase_scale * cal->phase[1]; @@ -95,7 +95,7 @@ survive_calibration_config survive_calibration_config_ctor() { } void survive_apply_bsd_calibration(SurviveContext *ctx, int lh, const FLT *in, FLT *out) { - survive_apply_bsd_calibration_by_flag(ctx, lh, &ctx->calibration_config, in, out); + survive_apply_bsd_calibration_by_config(ctx, lh, &ctx->calibration_config, in, out); } void survive_reproject_from_pose_with_config(const SurviveContext *ctx, struct survive_calibration_config *config, diff --git a/tools/showreproject/showreproject.cc b/tools/showreproject/showreproject.cc index 89d67c4..caa7a66 100644 --- a/tools/showreproject/showreproject.cc +++ b/tools/showreproject/showreproject.cc @@ -176,7 +176,7 @@ void drawbsds(SurviveContext *ctx) { FLT out[2]; auto config = survive_calibration_config_ctor(); config.use_flag = f; - survive_apply_bsd_calibration_by_flag(ctx, lh, &config, in, out); + survive_apply_bsd_calibration_by_config(ctx, lh, &config, in, out); double ex = out[0] - in[0]; double ey = out[1] - in[1]; if (f == SVCal_All) { -- cgit v1.2.3