libctru/qtm_8h.html
2024-11-03 20:36:34 +00:00

1213 lines
88 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libctru: include/3ds/services/qtm.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">libctru
&#160;<span id="projectnumber">v2.4.1</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_d475325f6a9fe3bfc3a495c72a9e475e.html">3ds</a></li><li class="navelem"><a class="el" href="dir_0e005207343684f6967052d1f51a7e66.html">services</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#define-members">Macros</a> &#124;
<a href="#enum-members">Enumerations</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">qtm.h File Reference</div> </div>
</div><!--header-->
<div class="contents">
<p>QTM services.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;<a class="el" href="types_8h_source.html">3ds/types.h</a>&gt;</code><br />
</div>
<p><a href="qtm_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structQtmStatusCfgData.html">QtmStatusCfgData</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">QTM status data (fully enabled/SS3D disabled) in <code>cfg</code>. Usually all-zero on N2DSXL. <a href="structQtmStatusCfgData.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structQtmCalibrationData.html">QtmCalibrationData</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">QTM calibration data (fully enabled/SS3D disabled) in <code>cfg</code>. Usually all-zero on N2DSXL. <a href="structQtmCalibrationData.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structQtmRawTrackingData.html">QtmRawTrackingData</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">QTM raw eye tracking data. <a href="structQtmRawTrackingData.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structQtmTrackingData.html">QtmTrackingData</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">QTM processed eye tracking data, suitable for 3D programming. <a href="structQtmTrackingData.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:a0beb3f0f9323c774b9afef472ac97d96"><td class="memItemLeft" align="right" valign="top"><a id="a0beb3f0f9323c774b9afef472ac97d96"></a>
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a0beb3f0f9323c774b9afef472ac97d96">QTM_STATUS_CFG_BLK_ID</a>&#160;&#160;&#160;0x180000u</td></tr>
<tr class="memdesc:a0beb3f0f9323c774b9afef472ac97d96"><td class="mdescLeft">&#160;</td><td class="mdescRight">ID of QTM status data (fully enabled/SS3D disabled) in <code>cfg</code> <br /></td></tr>
<tr class="separator:a0beb3f0f9323c774b9afef472ac97d96"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acf59772cd0a33cd6163ac54f34142723"><td class="memItemLeft" align="right" valign="top"><a id="acf59772cd0a33cd6163ac54f34142723"></a>
#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#acf59772cd0a33cd6163ac54f34142723">QTM_CAL_CFG_BLK_ID</a>&#160;&#160;&#160;0x180001u</td></tr>
<tr class="memdesc:acf59772cd0a33cd6163ac54f34142723"><td class="mdescLeft">&#160;</td><td class="mdescRight">ID of QTM calibration data in <code>cfg</code> <br /></td></tr>
<tr class="separator:acf59772cd0a33cd6163ac54f34142723"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
Enumerations</h2></td></tr>
<tr class="memitem:a9fa516918f2cb0791396dbf749de78d8"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8">QtmStatus</a> { <br />
&#160;&#160;<a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8a4ca3a4121e0f8af448752830c6ed1362">QTM_STATUS_ENABLED</a> = 0
, <br />
&#160;&#160;<a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8a25ceea2a5162cb4dc8c05c7d98009111">QTM_STATUS_SS3D_DISABLED</a> = 1
, <br />
&#160;&#160;<a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8af714942fcd2b32fa7d17d4baa434af8e">QTM_STATUS_UNAVAILABLE</a> = 2
<br />
}</td></tr>
<tr class="memdesc:a9fa516918f2cb0791396dbf749de78d8"><td class="mdescLeft">&#160;</td><td class="mdescRight">QTM enablement status (when cameras not in use by user), set by <code>qtm:s</code>. <a href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8">More...</a><br /></td></tr>
<tr class="separator:a9fa516918f2cb0791396dbf749de78d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae9d5eee1a0307d78bf728c1491422717"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ae9d5eee1a0307d78bf728c1491422717">QtmEyeSide</a> { <br />
&#160;&#160;<a class="el" href="qtm_8h.html#ae9d5eee1a0307d78bf728c1491422717a0d13547f5f93fbd88ee4dee910ab5c0c">QTM_EYE_LEFT</a> = 0
, <br />
&#160;&#160;<a class="el" href="qtm_8h.html#ae9d5eee1a0307d78bf728c1491422717ad8b9fc43558f7cac24968beccf343d70">QTM_EYE_RIGHT</a> = 1
, <br />
&#160;&#160;<a class="el" href="qtm_8h.html#ae9d5eee1a0307d78bf728c1491422717ab0084cc2cfc9928b4d6d98d584f4cb68">QTM_EYE_NUM</a>
<br />
}</td></tr>
<tr class="memdesc:ae9d5eee1a0307d78bf728c1491422717"><td class="mdescLeft">&#160;</td><td class="mdescRight">Left eye or right eye, for <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> and <a class="el" href="structQtmRawTrackingData.html">QtmRawTrackingData</a>. <a href="qtm_8h.html#ae9d5eee1a0307d78bf728c1491422717">More...</a><br /></td></tr>
<tr class="separator:ae9d5eee1a0307d78bf728c1491422717"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a197948b13b95bfda9733bcc939b1a82b"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82b">QtmServiceName</a> { <br />
&#160;&#160;<a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82ba8ba16ed8824c1319667675e8d932e54c">QTM_SERVICE_USER</a> = 0
, <br />
&#160;&#160;<a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82bab4fbecff985e8dcfdb1346c4ef9dc507">QTM_SERVICE_SYSTEM</a> = 1
, <br />
&#160;&#160;<a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82ba702cdc9d2fa4956ca7e3c35e13f90354">QTM_SERVICE_SYSTEM_PROCESS</a> = 2
<br />
}</td></tr>
<tr class="memdesc:a197948b13b95bfda9733bcc939b1a82b"><td class="mdescLeft">&#160;</td><td class="mdescRight">QTM service name enum, excluding <code>qtm:c</code> <a href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82b">More...</a><br /></td></tr>
<tr class="separator:a197948b13b95bfda9733bcc939b1a82b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:a74625c745b889ab7cc2233b63ba8d132"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a74625c745b889ab7cc2233b63ba8d132">qtmCheckServicesRegistered</a> (void)</td></tr>
<tr class="memdesc:a74625c745b889ab7cc2233b63ba8d132"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check whether or not QTM services are registered. <a href="qtm_8h.html#a74625c745b889ab7cc2233b63ba8d132">More...</a><br /></td></tr>
<tr class="separator:a74625c745b889ab7cc2233b63ba8d132"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6ca7e96ea5386ca0fcb4b1a819ef8155"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a6ca7e96ea5386ca0fcb4b1a819ef8155">qtmInit</a> (<a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82b">QtmServiceName</a> serviceName)</td></tr>
<tr class="memdesc:a6ca7e96ea5386ca0fcb4b1a819ef8155"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes QTM (except <code>qtm:c</code>). <a href="qtm_8h.html#a6ca7e96ea5386ca0fcb4b1a819ef8155">More...</a><br /></td></tr>
<tr class="separator:a6ca7e96ea5386ca0fcb4b1a819ef8155"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1c7d237388833868fb1e282d8a64e354"><td class="memItemLeft" align="right" valign="top"><a id="a1c7d237388833868fb1e282d8a64e354"></a>
void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a1c7d237388833868fb1e282d8a64e354">qtmExit</a> (void)</td></tr>
<tr class="memdesc:a1c7d237388833868fb1e282d8a64e354"><td class="mdescLeft">&#160;</td><td class="mdescRight">Exits QTM. <br /></td></tr>
<tr class="separator:a1c7d237388833868fb1e282d8a64e354"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6037b6588f76bf1b381daa5fd518d2bc"><td class="memItemLeft" align="right" valign="top"><a id="a6037b6588f76bf1b381daa5fd518d2bc"></a>
bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a6037b6588f76bf1b381daa5fd518d2bc">qtmIsInitialized</a> (void)</td></tr>
<tr class="memdesc:a6037b6588f76bf1b381daa5fd518d2bc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks whether or not a <code>qtm:u</code>, <code>qtm:s</code> or <code>qtm:sp</code> session is active. <br /></td></tr>
<tr class="separator:a6037b6588f76bf1b381daa5fd518d2bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aec132626f6fc4fc72236f5c3e0578c12"><td class="memItemLeft" align="right" valign="top"><a id="aec132626f6fc4fc72236f5c3e0578c12"></a>
<a class="el" href="types_8h.html#ab6d744c6b5de129f12937e482dc674fb">Handle</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#aec132626f6fc4fc72236f5c3e0578c12">qtmGetSessionHandle</a> (void)</td></tr>
<tr class="memdesc:aec132626f6fc4fc72236f5c3e0578c12"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a pointer to the current <code>qtm:u</code> / <code>qtm:s</code> / <code>qtm:sp</code> session handle. <br /></td></tr>
<tr class="separator:aec132626f6fc4fc72236f5c3e0578c12"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa7fc647d83f8f6d13e8c6b10dd6997eb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#aa7fc647d83f8f6d13e8c6b10dd6997eb">QTMU_GetRawTrackingDataEx</a> (<a class="el" href="structQtmRawTrackingData.html">QtmRawTrackingData</a> *outData, <a class="el" href="types_8h.html#a350c6fc928e3bdc6c6486268ac8fb269">s64</a> predictionTimePointOrZero)</td></tr>
<tr class="memdesc:aa7fc647d83f8f6d13e8c6b10dd6997eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the current raw eye tracking data, with an optional prediction made for predictionTimePointOrZero = t+dt, or for the current time point (QTM makes predictions based on gyro data since inner camera runs at 30 FPS). <a href="qtm_8h.html#aa7fc647d83f8f6d13e8c6b10dd6997eb">More...</a><br /></td></tr>
<tr class="separator:aa7fc647d83f8f6d13e8c6b10dd6997eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a97e8068832dac4c7efc722ddab0d22b7"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a97e8068832dac4c7efc722ddab0d22b7">QTMU_GetRawTrackingData</a> (<a class="el" href="structQtmRawTrackingData.html">QtmRawTrackingData</a> *outData)</td></tr>
<tr class="memdesc:a97e8068832dac4c7efc722ddab0d22b7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the current raw eye tracking data. <a href="qtm_8h.html#a97e8068832dac4c7efc722ddab0d22b7">More...</a><br /></td></tr>
<tr class="separator:a97e8068832dac4c7efc722ddab0d22b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acfc5af24bf6ba8bd03f557bf3383083c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">QTMU_GetTrackingDataEx</a> (<a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *outData, <a class="el" href="types_8h.html#a350c6fc928e3bdc6c6486268ac8fb269">s64</a> predictionTimePointOrZero)</td></tr>
<tr class="memdesc:acfc5af24bf6ba8bd03f557bf3383083c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the current normalized eye tracking data, made suitable for 3D programming with an optional prediction made for predictionTimePointOrZero = t+dt, or for the current time point (QTM makes predictions based on gyro data since inner camera runs at 30 FPS). <a href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">More...</a><br /></td></tr>
<tr class="separator:acfc5af24bf6ba8bd03f557bf3383083c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a04ef54be757a60f7db0237f51a2db593"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> (<a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *outData)</td></tr>
<tr class="memdesc:a04ef54be757a60f7db0237f51a2db593"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the current normalized eye tracking data, made suitable for 3D programming. <a href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">More...</a><br /></td></tr>
<tr class="separator:a04ef54be757a60f7db0237f51a2db593"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a464d38bd16269590e351c477b3544dc5"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a464d38bd16269590e351c477b3544dc5">qtmComputeFovX</a> (const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *data)</td></tr>
<tr class="memdesc:a464d38bd16269590e351c477b3544dc5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes an approximation of the horizontal angular field of view of the camera based on eye tracking data. <a href="qtm_8h.html#a464d38bd16269590e351c477b3544dc5">More...</a><br /></td></tr>
<tr class="separator:a464d38bd16269590e351c477b3544dc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a574e1eb9c86adef399d8807249894feb"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a574e1eb9c86adef399d8807249894feb">qtmComputeFovY</a> (const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *data)</td></tr>
<tr class="memdesc:a574e1eb9c86adef399d8807249894feb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes an approximation of the vertical angular field of view of the camera based on eye tracking data. <a href="qtm_8h.html#a574e1eb9c86adef399d8807249894feb">More...</a><br /></td></tr>
<tr class="separator:a574e1eb9c86adef399d8807249894feb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2b5d3443201f015cd0047083e276faeb"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a2b5d3443201f015cd0047083e276faeb">qtmComputeInverseAspectRatio</a> (const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *data)</td></tr>
<tr class="memdesc:a2b5d3443201f015cd0047083e276faeb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes a rough approximation of the inverse of the aspect ration of the camera based on eye tracking data. <a href="qtm_8h.html#a2b5d3443201f015cd0047083e276faeb">More...</a><br /></td></tr>
<tr class="separator:a2b5d3443201f015cd0047083e276faeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ace1cdf2e2c3b704e8fc6147465af3237"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ace1cdf2e2c3b704e8fc6147465af3237">qtmComputeHeadTiltAngle</a> (const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *data)</td></tr>
<tr class="memdesc:ace1cdf2e2c3b704e8fc6147465af3237"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes the user's head tilt angle, that is, the angle between the line through both eyes and the camera's horizontal axis in camera space. <a href="qtm_8h.html#ace1cdf2e2c3b704e8fc6147465af3237">More...</a><br /></td></tr>
<tr class="separator:ace1cdf2e2c3b704e8fc6147465af3237"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad2fe3f05b1e87d5213956b55f01bb9e9"><td class="memItemLeft" align="right" valign="top">float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ad2fe3f05b1e87d5213956b55f01bb9e9">qtmEstimateEyeToCameraDistance</a> (const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *data)</td></tr>
<tr class="memdesc:ad2fe3f05b1e87d5213956b55f01bb9e9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Estimates the distance between the user's eyes and the camera, based on eye tracking data. <a href="qtm_8h.html#ad2fe3f05b1e87d5213956b55f01bb9e9">More...</a><br /></td></tr>
<tr class="separator:ad2fe3f05b1e87d5213956b55f01bb9e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ade8e60b3b7da9156984217cd71b46535"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ade8e60b3b7da9156984217cd71b46535">QTMU_EnableManualIrLedControl</a> (void)</td></tr>
<tr class="memdesc:ade8e60b3b7da9156984217cd71b46535"><td class="mdescLeft">&#160;</td><td class="mdescRight">Temporarily enables manual control of the IR LED by user, disabling its automatic control. <a href="qtm_8h.html#ade8e60b3b7da9156984217cd71b46535">More...</a><br /></td></tr>
<tr class="separator:ade8e60b3b7da9156984217cd71b46535"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a340a4833c1f945ab3fe512f9e37ea048"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a340a4833c1f945ab3fe512f9e37ea048">QTMU_DisableManualIrLedControl</a> (void)</td></tr>
<tr class="memdesc:a340a4833c1f945ab3fe512f9e37ea048"><td class="mdescLeft">&#160;</td><td class="mdescRight">Temporarily disables manual control of the IR LED by user, re-enabling its automatic control. <a href="qtm_8h.html#a340a4833c1f945ab3fe512f9e37ea048">More...</a><br /></td></tr>
<tr class="separator:a340a4833c1f945ab3fe512f9e37ea048"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2915cfd8b8553570516f71b0f169b9f7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a2915cfd8b8553570516f71b0f169b9f7">QTMU_SetIrLedStatus</a> (bool on)</td></tr>
<tr class="memdesc:a2915cfd8b8553570516f71b0f169b9f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Turns the IR LED on or off during manual control. <a href="qtm_8h.html#a2915cfd8b8553570516f71b0f169b9f7">More...</a><br /></td></tr>
<tr class="separator:a2915cfd8b8553570516f71b0f169b9f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab1ae0235fb4962783d720a38ecc9b44b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ab1ae0235fb4962783d720a38ecc9b44b">qtmClearIrLedOverrides</a> (void)</td></tr>
<tr class="memdesc:ab1ae0235fb4962783d720a38ecc9b44b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Attempts to clear IR LED overrides from any of the relevant commands in <code>qtm:u</code>, <code>qtm:s</code> (and <code>qtm:c</code>) commands by calling <a class="el" href="qtm_8h.html#ade8e60b3b7da9156984217cd71b46535">QTMU_EnableManualIrLedControl</a> followed by <a class="el" href="qtm_8h.html#a340a4833c1f945ab3fe512f9e37ea048">QTMU_DisableManualIrLedControl</a>, so that auto IR LED management takes place again. <a href="qtm_8h.html#ab1ae0235fb4962783d720a38ecc9b44b">More...</a><br /></td></tr>
<tr class="separator:ab1ae0235fb4962783d720a38ecc9b44b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:acef0c87052038ce12598aff11ff8e527"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#acef0c87052038ce12598aff11ff8e527">QTMU_IsCurrentAppBlacklisted</a> (bool *outBlacklisted)</td></tr>
<tr class="memdesc:acef0c87052038ce12598aff11ff8e527"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks whether or not QTM has been blacklisted, ie. <a href="qtm_8h.html#acef0c87052038ce12598aff11ff8e527">More...</a><br /></td></tr>
<tr class="separator:acef0c87052038ce12598aff11ff8e527"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac5136b5ef74245690b36ca1862ccaff6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ac5136b5ef74245690b36ca1862ccaff6">QTMS_SetCenterBarrierPosition</a> (float position)</td></tr>
<tr class="memdesc:ac5136b5ef74245690b36ca1862ccaff6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the neutral (center) barrier position/offset in calibration, <em>without</em> saving it to <code>cfg</code>. <a href="qtm_8h.html#ac5136b5ef74245690b36ca1862ccaff6">More...</a><br /></td></tr>
<tr class="separator:ac5136b5ef74245690b36ca1862ccaff6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa1f9aa48df0419f1ad8a337f6e33c2b2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#aa1f9aa48df0419f1ad8a337f6e33c2b2">QTMS_GetCameraLuminance</a> (float *outLuminanceLux)</td></tr>
<tr class="memdesc:aa1f9aa48df0419f1ad8a337f6e33c2b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the average ambient luminance as perceived by the inner camera (in lux). <a href="qtm_8h.html#aa1f9aa48df0419f1ad8a337f6e33c2b2">More...</a><br /></td></tr>
<tr class="separator:aa1f9aa48df0419f1ad8a337f6e33c2b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ade83e412713ccae36eb48b3319d564ce"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ade83e412713ccae36eb48b3319d564ce">QTMS_EnableAutoBarrierControl</a> (void)</td></tr>
<tr class="memdesc:ade83e412713ccae36eb48b3319d564ce"><td class="mdescLeft">&#160;</td><td class="mdescRight">Enables automatic barrier control when in 3D mode with "super stable 3D" enabled. <a href="qtm_8h.html#ade83e412713ccae36eb48b3319d564ce">More...</a><br /></td></tr>
<tr class="separator:ade83e412713ccae36eb48b3319d564ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa64b1f664a2fbcfa954bd26b0a63bba6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#aa64b1f664a2fbcfa954bd26b0a63bba6">QTMS_DisableAutoBarrierControl</a> (void)</td></tr>
<tr class="memdesc:aa64b1f664a2fbcfa954bd26b0a63bba6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Temporarily disables automatic barrier control (when in 3D mode with "super stable 3D" enabled). <a href="qtm_8h.html#aa64b1f664a2fbcfa954bd26b0a63bba6">More...</a><br /></td></tr>
<tr class="separator:aa64b1f664a2fbcfa954bd26b0a63bba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afcd2144116dbca5726189fb5e3613505"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#afcd2144116dbca5726189fb5e3613505">QTMS_SetBarrierPosition</a> (<a class="el" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a> position)</td></tr>
<tr class="memdesc:afcd2144116dbca5726189fb5e3613505"><td class="mdescLeft">&#160;</td><td class="mdescRight">Temporarily sets the parallax barrier's position (offset in iod/12 units, assuming slit width of 6 units). <a href="qtm_8h.html#afcd2144116dbca5726189fb5e3613505">More...</a><br /></td></tr>
<tr class="separator:afcd2144116dbca5726189fb5e3613505"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d47d53855263c4c6bd263ecb1adb55a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a5d47d53855263c4c6bd263ecb1adb55a">QTMS_GetCurrentBarrierPosition</a> (<a class="el" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a> *outPosition)</td></tr>
<tr class="memdesc:a5d47d53855263c4c6bd263ecb1adb55a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the current position of the parallax barrier (offset in iod/12 units, slit width of 6 units). <a href="qtm_8h.html#a5d47d53855263c4c6bd263ecb1adb55a">More...</a><br /></td></tr>
<tr class="separator:a5d47d53855263c4c6bd263ecb1adb55a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a784e0f81a6591854ceaaaed71ee6c31d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a784e0f81a6591854ceaaaed71ee6c31d">QTMS_SetIrLedStatusOverride</a> (bool on)</td></tr>
<tr class="memdesc:a784e0f81a6591854ceaaaed71ee6c31d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Temporarily overrides IR LED state. <a href="qtm_8h.html#a784e0f81a6591854ceaaaed71ee6c31d">More...</a><br /></td></tr>
<tr class="separator:a784e0f81a6591854ceaaaed71ee6c31d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaa7ac103ccf8e7955b4a54f918d3a49b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#aaa7ac103ccf8e7955b4a54f918d3a49b">QTMS_SetCalibrationData</a> (const <a class="el" href="structQtmCalibrationData.html">QtmCalibrationData</a> *cal, bool saveCalToCfg)</td></tr>
<tr class="memdesc:aaa7ac103ccf8e7955b4a54f918d3a49b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets calibration data, taking effect immediately, and optionally saves it to <code>cfg</code>. <a href="qtm_8h.html#aaa7ac103ccf8e7955b4a54f918d3a49b">More...</a><br /></td></tr>
<tr class="separator:aaa7ac103ccf8e7955b4a54f918d3a49b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae4c71f2470db8ab671724ae88ee0c33d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ae4c71f2470db8ab671724ae88ee0c33d">QTMS_GetQtmStatus</a> (<a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8">QtmStatus</a> *outQtmStatus)</td></tr>
<tr class="memdesc:ae4c71f2470db8ab671724ae88ee0c33d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the current QTM status (enabled/ss3d disabled/unavailable). <a href="qtm_8h.html#ae4c71f2470db8ab671724ae88ee0c33d">More...</a><br /></td></tr>
<tr class="separator:ae4c71f2470db8ab671724ae88ee0c33d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab3a3f1ad37df943daf7d322f5ed0908d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> (<a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8">QtmStatus</a> qtmStatus)</td></tr>
<tr class="memdesc:ab3a3f1ad37df943daf7d322f5ed0908d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the current QTM status (enabled/ss3d disabled/unavailable). <a href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">More...</a><br /></td></tr>
<tr class="separator:ab3a3f1ad37df943daf7d322f5ed0908d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab5b4018d1f26b729dce93190755d17d1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ab5b4018d1f26b729dce93190755d17d1">QTMSP_NotifyTopLcdModeChange</a> (<a class="el" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a> newMode)</td></tr>
<tr class="memdesc:ab5b4018d1f26b729dce93190755d17d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called by GSP's LCD driver to signal 2D&lt;&gt;3D mode change. <a href="qtm_8h.html#ab5b4018d1f26b729dce93190755d17d1">More...</a><br /></td></tr>
<tr class="separator:ab5b4018d1f26b729dce93190755d17d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0e413bd1edd9fdf44de2e22eaca15aab"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a0e413bd1edd9fdf44de2e22eaca15aab">QTMSP_NotifyTopLcdPowerOn</a> (void)</td></tr>
<tr class="memdesc:a0e413bd1edd9fdf44de2e22eaca15aab"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called by GSP's LCD driver during top LCD power-on to signal to QTM that it may power on and/or reconfigure then use the TI TCA6416A expander. <a href="qtm_8h.html#a0e413bd1edd9fdf44de2e22eaca15aab">More...</a><br /></td></tr>
<tr class="separator:a0e413bd1edd9fdf44de2e22eaca15aab"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a708b7eafe8069dcd59d58e2e47dfd509"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#a708b7eafe8069dcd59d58e2e47dfd509">QTMSP_IsExpanderInUse</a> (bool *outActive)</td></tr>
<tr class="memdesc:a708b7eafe8069dcd59d58e2e47dfd509"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called by GSP's LCD driver to know whether or not QTM's expander thread is using the TI TCA6416A expander; it is waiting for this to become true/false during LCD power on/power off to proceed. <a href="qtm_8h.html#a708b7eafe8069dcd59d58e2e47dfd509">More...</a><br /></td></tr>
<tr class="separator:a708b7eafe8069dcd59d58e2e47dfd509"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad7a7cdef8186a82103d490735bd69678"><td class="memItemLeft" align="right" valign="top"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qtm_8h.html#ad7a7cdef8186a82103d490735bd69678">QTMSP_NotifyTopLcdPowerOff</a> (void)</td></tr>
<tr class="memdesc:ad7a7cdef8186a82103d490735bd69678"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called by GSP's LCD driver during top LCD power-on to signal to QTM that it needs to switch the parallax barrier state to a 2D state (all-transparent mask). <a href="qtm_8h.html#ad7a7cdef8186a82103d490735bd69678">More...</a><br /></td></tr>
<tr class="separator:ad7a7cdef8186a82103d490735bd69678"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>QTM services. </p>
<p>QTM is responsible for the following:</p><ul>
<li>tracking and predicting the position of the user's eyes. This is done by using the inner camera sampling at 320x240px at 30 FPS, and by using the gyroscope to predict the position of the eyes between two camera samples (effectively doubling the tracking rate). The API reporting eye tracking data is actually <em>console-agnostic</em>. This concept is most likely covered by patent US9098112B2</li>
<li>automatically managing the IR LED emitter used for eye tracking in low-light conditions</li>
<li>managing the state of the parallax barrier by controlling the positions of the barrier's mask (opaque/transparent state by repeating pattern of 12 units, plus polarity). This is done via a TI TCA6416A I2C-&gt;Parallel expander (highlighted in yellow in this teardown photo: <a href="https://guide-images.cdn.ifixit.com/igi/IKlW6WTZKKmapYkt.full">https://guide-images.cdn.ifixit.com/igi/IKlW6WTZKKmapYkt.full</a>, with the expected 12 traces being clearly visible near the ribbon cable slot)</li>
<li>updating the barrier position according to eye tracking data relative to an optimal setting stored in calibration data: this is what Nintendo calls "Super Stable 3D" (SS3D); not done when in 2D mode</li>
</ul>
<p>Head-tracking can be used even if SS3D is disabled.</p>
<p>SS3D works as follows:</p><ul>
<li>compute the raw X and Y pixel coordinates for the eye midpoint: <code>rawX = (leftEyeRawPxCoords.x + rightEyeRawPxCoords.x) / 2</code> <code>rawY = (leftEyeRawPxCoords.y + rightEyeRawPxCoords.y) / 2</code></li>
<li>rotate the value around the optical Z-axis using the optimal eye-to-camera angle from calibration data, with a rotation matrix</li>
<li>normalize the X value: <code>xC = (rawX / 320) - 0.5</code></li>
<li>transform into world space coordinate, using fovX from calibration (convert to radians first). Note that this fovX doesn't take lens distortion into account and is slightly different from the hardcoded angle used in <a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> <code>x = xC * tan(fovX/2)</code></li>
<li>multiply by length of adjacent side (eye-to-camera distance) to get the length of the opposite side. This is the eye horizontal deviation to camera lens in mm, which is then converted to number of iod/12 units: <code>delta = x * optimalDistance / (iod/12)</code></li>
<li>we then obtain the new target position of the parallax barrier (expressed in iod/12 units, mod iod/12): <code>pos = centerPos + delta</code><ul>
<li>the value is then rounded to nearest integer. To avoid artifacts, if the rounded value is going to increase, then 0.01 is subtracted, and if it is going to decrease, then 0.01 is added. The value is rounded again to compute the final discrete value written to the expander (barrier position).</li>
<li>note: all calculation in QTM and otherwise assume interocular distance to be 62mm (the average). Assumedly, if the user's IOD is different, then "optimal distance to screen" effectively changes for that user.</li>
</ul>
</li>
</ul>
<p>QTM services are not present on O3DS, thus caller must call <a class="el" href="qtm_8h.html#a74625c745b889ab7cc2233b63ba8d132">qtmCheckServicesRegistered</a> to check if the services are registered. Moreover, since QTM functionality might not always be available (due to blacklist or console being N2DSXL), <code>qtm:u</code> users should check Result return values, and <code>qtm:s</code> users can call <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> to check the actual availability status.</p>
<p>Considering that the eye tracking data reporting API is hardware-agnostic, it is advisable to hardcode neither camera aspect ratio (even if it is 4/3 on real hardware) and resolution nor field-of-view angle.</p>
<p>There is a separate QTM service, <code>qtm:c</code> ("hardware check"), that lets you manipulate parallax barrier pattern directly. It is covered in <a class="el" href="qtmc_8h.html">qtmc.h</a> instead. </p>
</div><h2 class="groupheader">Enumeration Type Documentation</h2>
<a id="ae9d5eee1a0307d78bf728c1491422717"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae9d5eee1a0307d78bf728c1491422717">&#9670;&nbsp;</a></span>QtmEyeSide</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="qtm_8h.html#ae9d5eee1a0307d78bf728c1491422717">QtmEyeSide</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Left eye or right eye, for <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> and <a class="el" href="structQtmRawTrackingData.html">QtmRawTrackingData</a>. </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ae9d5eee1a0307d78bf728c1491422717a0d13547f5f93fbd88ee4dee910ab5c0c"></a>QTM_EYE_LEFT&#160;</td><td class="fielddoc"><p>Left eye. </p>
</td></tr>
<tr><td class="fieldname"><a id="ae9d5eee1a0307d78bf728c1491422717ad8b9fc43558f7cac24968beccf343d70"></a>QTM_EYE_RIGHT&#160;</td><td class="fielddoc"><p>Right eye. </p>
</td></tr>
<tr><td class="fieldname"><a id="ae9d5eee1a0307d78bf728c1491422717ab0084cc2cfc9928b4d6d98d584f4cb68"></a>QTM_EYE_NUM&#160;</td><td class="fielddoc"><p>Number of eyes. </p>
</td></tr>
</table>
</div>
</div>
<a id="a197948b13b95bfda9733bcc939b1a82b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a197948b13b95bfda9733bcc939b1a82b">&#9670;&nbsp;</a></span>QtmServiceName</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82b">QtmServiceName</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>QTM service name enum, excluding <code>qtm:c</code> </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a197948b13b95bfda9733bcc939b1a82ba8ba16ed8824c1319667675e8d932e54c"></a>QTM_SERVICE_USER&#160;</td><td class="fielddoc"><p><code>qtm:u</code>: has eye-tracking commands and IR LED control commands, but for some reason cannot fetch ambiant lux data from the camera's luminosity sensor. </p>
</td></tr>
<tr><td class="fieldname"><a id="a197948b13b95bfda9733bcc939b1a82bab4fbecff985e8dcfdb1346c4ef9dc507"></a>QTM_SERVICE_SYSTEM&#160;</td><td class="fielddoc"><p><code>qtm:s</code>: has access to all <code>qtm:u</code> commands, plus luminosity sensor, plus manual barrier position setting and calibration adjustment commands. </p>
<p>Automatic barrier control is reenabled on session exit. </p>
</td></tr>
<tr><td class="fieldname"><a id="a197948b13b95bfda9733bcc939b1a82ba702cdc9d2fa4956ca7e3c35e13f90354"></a>QTM_SERVICE_SYSTEM_PROCESS&#160;</td><td class="fielddoc"><p><code>qtm:sp</code>: has access to all <code>qtm:s</code> (and <code>qtm:u</code>) commands, and merely has a few more commands that GSP uses to notify QTM of 2D&lt;&gt;3D mode switches and power events. </p>
<p>Automatic barrier control is reenabled on session exit. GSP always keeps a <code>qtm:sp</code> sessions open (at least on latest system version), whereas NS opens then immediately closes a <code>qtm:sp</code> sessions only when dealing with a "blacklisted" application (that is, almost never). </p>
</td></tr>
</table>
</div>
</div>
<a id="a9fa516918f2cb0791396dbf749de78d8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9fa516918f2cb0791396dbf749de78d8">&#9670;&nbsp;</a></span>QtmStatus</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8">QtmStatus</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>QTM enablement status (when cameras not in use by user), set by <code>qtm:s</code>. </p>
<dl class="section note"><dt>Note</dt><dd>Manual IR LED control, camera lux, and <code>qtm:c</code> commands remain available for use on N3DS and N3DSXL regardless. </dd></dl>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a9fa516918f2cb0791396dbf749de78d8a4ca3a4121e0f8af448752830c6ed1362"></a>QTM_STATUS_ENABLED&#160;</td><td class="fielddoc"><p>QTM is fully enabled. </p>
</td></tr>
<tr><td class="fieldname"><a id="a9fa516918f2cb0791396dbf749de78d8a25ceea2a5162cb4dc8c05c7d98009111"></a>QTM_STATUS_SS3D_DISABLED&#160;</td><td class="fielddoc"><p>QTM "super stable 3D" feature is disabled. Parallax barrier hardware state is configured to match O3DS. </p>
</td></tr>
<tr><td class="fieldname"><a id="a9fa516918f2cb0791396dbf749de78d8af714942fcd2b32fa7d17d4baa434af8e"></a>QTM_STATUS_UNAVAILABLE&#160;</td><td class="fielddoc"><p>QTM is unavailable: either "blacklisted" (usually by NS) for the current title, <b>or console is a N2DSXL</b>. </p>
<pre class="fragment"> In this state, all QTM functionality is disabled. This includes "super-stable 3D"
(ie. auto barrier adjustment) including `qtm:s` manual barrier position setting functions,
head tracking, IR LED control and camera luminance reporting (400.0 is returned instead).
</pre> <dl class="section note"><dt>Note</dt><dd><code>qtm:c</code> barrier hardware state setting function (blah) bypasses this state. </dd>
<dd>
Due to an oversight, <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> allows changing QTM state on N2DSXL. This is not intended to be done, and is in fact never done by official software. </dd></dl>
</td></tr>
</table>
</div>
</div>
<h2 class="groupheader">Function Documentation</h2>
<a id="a74625c745b889ab7cc2233b63ba8d132"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a74625c745b889ab7cc2233b63ba8d132">&#9670;&nbsp;</a></span>qtmCheckServicesRegistered()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool qtmCheckServicesRegistered </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Check whether or not QTM services are registered. </p>
<dl class="section return"><dt>Returns</dt><dd>True on O3DS systems, false on N3DS systems. </dd></dl>
</div>
</div>
<a id="ab1ae0235fb4962783d720a38ecc9b44b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab1ae0235fb4962783d720a38ecc9b44b">&#9670;&nbsp;</a></span>qtmClearIrLedOverrides()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> qtmClearIrLedOverrides </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Attempts to clear IR LED overrides from any of the relevant commands in <code>qtm:u</code>, <code>qtm:s</code> (and <code>qtm:c</code>) commands by calling <a class="el" href="qtm_8h.html#ade8e60b3b7da9156984217cd71b46535">QTMU_EnableManualIrLedControl</a> followed by <a class="el" href="qtm_8h.html#a340a4833c1f945ab3fe512f9e37ea048">QTMU_DisableManualIrLedControl</a>, so that auto IR LED management takes place again. </p>
<dl class="section return"><dt>Returns</dt><dd>The value returned by <a class="el" href="qtm_8h.html#a340a4833c1f945ab3fe512f9e37ea048">QTMU_DisableManualIrLedControl</a>. </dd></dl>
</div>
</div>
<a id="a464d38bd16269590e351c477b3544dc5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a464d38bd16269590e351c477b3544dc5">&#9670;&nbsp;</a></span>qtmComputeFovX()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">float qtmComputeFovX </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *&#160;</td>
<td class="paramname"><em>data</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Computes an approximation of the horizontal angular field of view of the camera based on eye tracking data. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">data</td><td>Eye tracking data, obtained from <a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> or <a class="el" href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">QTMU_GetTrackingDataEx</a>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Horizontal angular field of view in radians. Corresponds to 64.9 degrees on real hardware. </dd></dl>
</div>
</div>
<a id="a574e1eb9c86adef399d8807249894feb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a574e1eb9c86adef399d8807249894feb">&#9670;&nbsp;</a></span>qtmComputeFovY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">float qtmComputeFovY </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *&#160;</td>
<td class="paramname"><em>data</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Computes an approximation of the vertical angular field of view of the camera based on eye tracking data. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">data</td><td>Eye tracking data, obtained from <a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> or <a class="el" href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">QTMU_GetTrackingDataEx</a>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Vertical angular field of view in radians. Corresponds to 51.0 degrees on real hardware. </dd></dl>
</div>
</div>
<a id="ace1cdf2e2c3b704e8fc6147465af3237"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ace1cdf2e2c3b704e8fc6147465af3237">&#9670;&nbsp;</a></span>qtmComputeHeadTiltAngle()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">float qtmComputeHeadTiltAngle </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *&#160;</td>
<td class="paramname"><em>data</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Computes the user's head tilt angle, that is, the angle between the line through both eyes and the camera's horizontal axis in camera space. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">data</td><td>Eye tracking data, obtained from <a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> or <a class="el" href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">QTMU_GetTrackingDataEx</a>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Horizontal head angle relative to camera, in radians. </dd></dl>
</div>
</div>
<a id="a2b5d3443201f015cd0047083e276faeb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2b5d3443201f015cd0047083e276faeb">&#9670;&nbsp;</a></span>qtmComputeInverseAspectRatio()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">float qtmComputeInverseAspectRatio </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *&#160;</td>
<td class="paramname"><em>data</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Computes a rough approximation of the inverse of the aspect ration of the camera based on eye tracking data. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">data</td><td>Eye tracking data, obtained from <a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> or <a class="el" href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">QTMU_GetTrackingDataEx</a>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Rough approximation of the inverse of the aspect ratio of the camera. Aspect ratio is exactly 0.75 on real hardware. </dd></dl>
</div>
</div>
<a id="ad2fe3f05b1e87d5213956b55f01bb9e9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad2fe3f05b1e87d5213956b55f01bb9e9">&#9670;&nbsp;</a></span>qtmEstimateEyeToCameraDistance()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">float qtmEstimateEyeToCameraDistance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *&#160;</td>
<td class="paramname"><em>data</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Estimates the distance between the user's eyes and the camera, based on eye tracking data. </p>
<p>This may be a little bit inaccurate, as this assumes interocular distance of 62mm (like all 3DS software does), and that both eyes are at the same distance from the screen.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">data</td><td>Eye tracking data, obtained from <a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> or <a class="el" href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">QTMU_GetTrackingDataEx</a>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Eye-to-camera distance in millimeters. </dd></dl>
</div>
</div>
<a id="a6ca7e96ea5386ca0fcb4b1a819ef8155"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6ca7e96ea5386ca0fcb4b1a819ef8155">&#9670;&nbsp;</a></span>qtmInit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> qtmInit </td>
<td>(</td>
<td class="paramtype"><a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82b">QtmServiceName</a>&#160;</td>
<td class="paramname"><em>serviceName</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initializes QTM (except <code>qtm:c</code>). </p>
<p>Excluding <code>qtm:c</code>, QTM has three main services. Only 3 sessions (2 until 9.3.0 sysupdate) for ALL services COMBINED, including <code>qtm:c</code>, can be open at a time. Refer to <a class="el" href="qtm_8h.html#a197948b13b95bfda9733bcc939b1a82b">QtmServiceName</a> enum value descriptions to see which service to choose.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">serviceName</td><td>QTM service name enum value (corresponding to <code>qtm:u</code>, <code>qtm:s</code> and <code>qtm:sp</code> respectively). </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>Result of <a class="el" href="qtm_8h.html#a74625c745b889ab7cc2233b63ba8d132">qtmCheckServicesRegistered</a> should be checked before calling this function. </dd></dl>
</div>
</div>
<a id="aa64b1f664a2fbcfa954bd26b0a63bba6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa64b1f664a2fbcfa954bd26b0a63bba6">&#9670;&nbsp;</a></span>QTMS_DisableAutoBarrierControl()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_DisableAutoBarrierControl </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Temporarily disables automatic barrier control (when in 3D mode with "super stable 3D" enabled). </p>
<dl class="section note"><dt>Note</dt><dd>This is automatically called upon <code>qtm:s</code> and <code>qtm:sp</code> session exit. </dd></dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), otherwise 0 (success). </dd></dl>
<dl class="section note"><dt>Note</dt><dd>Due to an oversight, <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> allows changing QTM state on N2DSXL. This is not intended to be done, and is in fact never done by official software. If that is regardless the case, this function here does nothing. </dd></dl>
</div>
</div>
<a id="ade83e412713ccae36eb48b3319d564ce"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ade83e412713ccae36eb48b3319d564ce">&#9670;&nbsp;</a></span>QTMS_EnableAutoBarrierControl()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_EnableAutoBarrierControl </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Enables automatic barrier control when in 3D mode with "super stable 3D" enabled. </p>
<dl class="section note"><dt>Note</dt><dd>This is automatically called upon <code>qtm:s</code> and <code>qtm:sp</code> session exit. </dd></dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), otherwise 0 (success). </dd></dl>
<dl class="section note"><dt>Note</dt><dd>Due to an oversight, <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> allows changing QTM state on N2DSXL. This is not intended to be done, and is in fact never done by official software. If that is regardless the case, this function here does nothing. </dd></dl>
</div>
</div>
<a id="aa1f9aa48df0419f1ad8a337f6e33c2b2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa1f9aa48df0419f1ad8a337f6e33c2b2">&#9670;&nbsp;</a></span>QTMS_GetCameraLuminance()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_GetCameraLuminance </td>
<td>(</td>
<td class="paramtype">float *&#160;</td>
<td class="paramname"><em>outLuminanceLux</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the average ambient luminance as perceived by the inner camera (in lux). </p>
<p>If QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), returns 400.0 instead of the actual luminance.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outLuminanceLux</td><td>Where to write the luminance to. Always 400.0 on N2DSXL. </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>Camera exposure, and in particular auto-exposure affects the returned luminance value. This must be taken into consideration, because this value can thus surge when user covers the inner camera. </dd></dl>
<dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
</div>
</div>
<a id="a5d47d53855263c4c6bd263ecb1adb55a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5d47d53855263c4c6bd263ecb1adb55a">&#9670;&nbsp;</a></span>QTMS_GetCurrentBarrierPosition()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_GetCurrentBarrierPosition </td>
<td>(</td>
<td class="paramtype"><a class="el" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a> *&#160;</td>
<td class="paramname"><em>outPosition</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the current position of the parallax barrier (offset in iod/12 units, slit width of 6 units). </p>
<p>When "super stable 3D" is disabled, returns 13 instead.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outPosition</td><td>Where to write the barrier's position to. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), otherwise 0 (success). </dd></dl>
<dl class="section note"><dt>Note</dt><dd>When SS3D is disabled, this returns 13 to <code>outPosition</code> . When in 2D mode, the returned position is not updated. </dd>
<dd>
Due to an oversight, <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> allows changing QTM state on N2DSXL. This is not intended to be done, and is in fact never done by official software. If that is regardless the case, this function here returns 13 to <code>outPosition</code> . </dd></dl>
<dl class="section see"><dt>See also</dt><dd>QTMC_SetBarrierPattern </dd></dl>
</div>
</div>
<a id="ae4c71f2470db8ab671724ae88ee0c33d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae4c71f2470db8ab671724ae88ee0c33d">&#9670;&nbsp;</a></span>QTMS_GetQtmStatus()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_GetQtmStatus </td>
<td>(</td>
<td class="paramtype"><a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8">QtmStatus</a> *&#160;</td>
<td class="paramname"><em>outQtmStatus</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the current QTM status (enabled/ss3d disabled/unavailable). </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outQtmStatus</td><td>Where to write the QTM status to. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Always 0. </dd></dl>
</div>
</div>
<a id="afcd2144116dbca5726189fb5e3613505"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afcd2144116dbca5726189fb5e3613505">&#9670;&nbsp;</a></span>QTMS_SetBarrierPosition()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_SetBarrierPosition </td>
<td>(</td>
<td class="paramtype"><a class="el" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a>&#160;</td>
<td class="paramname"><em>position</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Temporarily sets the parallax barrier's position (offset in iod/12 units, assuming slit width of 6 units). </p>
<p>Does nothing in 2D mode and/or if "super stable 3D" is disabled.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">position</td><td>Parallax barrier position (offset in units), must be between 0 and 11 (both included) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), 0xE0E18002 if <code>position</code> is not in range, otherwise 0 (success). </dd></dl>
<dl class="section note"><dt>Note</dt><dd>Due to an oversight, <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> allows changing QTM state on N2DSXL. This is not intended to be done, and is in fact never done by official software. If that is regardless the case, this function here does nothing. </dd>
<dd>
No effect when the screen is in 2D mode. </dd></dl>
<dl class="section see"><dt>See also</dt><dd>QTMC_SetBarrierPattern </dd></dl>
</div>
</div>
<a id="aaa7ac103ccf8e7955b4a54f918d3a49b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaa7ac103ccf8e7955b4a54f918d3a49b">&#9670;&nbsp;</a></span>QTMS_SetCalibrationData()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_SetCalibrationData </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="structQtmCalibrationData.html">QtmCalibrationData</a> *&#160;</td>
<td class="paramname"><em>cal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>saveCalToCfg</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Sets calibration data, taking effect immediately, and optionally saves it to <code>cfg</code>. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">cal</td><td>Pointer to calibration data. </td></tr>
<tr><td class="paramname">saveCalToCfg</td><td>Whether or not to persist the calibration data in <code>cfg</code>. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), otherwise whatever <code>cfg:s</code> commands return (if used), or 0 (success). </dd></dl>
<dl class="section note"><dt>Note</dt><dd>There is no "get" counterpart for this function, and there is no way to see the current calibration data in use unless it has been saved to <code>cfg</code>. </dd>
<dd>
Due to an oversight, <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> allows changing QTM state on N2DSXL. This is not intended to be done, and is in fact never done by official software. If that is regardless the case, this function here doesn't apply calibrations parameters (they may still be saved, however, even though QTM calibration blocks are always normally 0 on N2DSXL). </dd></dl>
</div>
</div>
<a id="ac5136b5ef74245690b36ca1862ccaff6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac5136b5ef74245690b36ca1862ccaff6">&#9670;&nbsp;</a></span>QTMS_SetCenterBarrierPosition()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_SetCenterBarrierPosition </td>
<td>(</td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>position</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Sets the neutral (center) barrier position/offset in calibration, <em>without</em> saving it to <code>cfg</code>. </p>
<p>Takes effect immediately. SS3D works by calculating the position of the eye midpoint, rotated by the ideal eye-to-camera angle, expressed in (iod/12 units, iod assumed to be 62mm).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">position</td><td>Center barrier position, in terms of iod/12 units modulo iod/12. </td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>This field is floating-point for QTM auto-adjustment purposes, however the actual barrier position in hardware is an integer. </dd>
<dd>
This is the field that System Settings lets you add -1.0 to +1.0 to. </dd>
<dd>
There is no "get" counterpart for this. </dd></dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), otherwise 0 (success). </dd></dl>
</div>
</div>
<a id="a784e0f81a6591854ceaaaed71ee6c31d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a784e0f81a6591854ceaaaed71ee6c31d">&#9670;&nbsp;</a></span>QTMS_SetIrLedStatusOverride()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_SetIrLedStatusOverride </td>
<td>(</td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>on</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Temporarily overrides IR LED state. </p>
<p>Requires "manual control" from <code>qtm:u</code> to be disabled, and has lower priority than it.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">on</td><td>Whether to turn the IR LED on or off. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18005</code> if manual control was enabled or if the operation failed, <code>0xC8A18008</code> if camera is in use by user (unless "hardware check" API enabled), or <code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL). Otherwise, 0 (success). </dd></dl>
</div>
</div>
<a id="ab3a3f1ad37df943daf7d322f5ed0908d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab3a3f1ad37df943daf7d322f5ed0908d">&#9670;&nbsp;</a></span>QTMS_SetQtmStatus()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMS_SetQtmStatus </td>
<td>(</td>
<td class="paramtype"><a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8">QtmStatus</a>&#160;</td>
<td class="paramname"><em>qtmStatus</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the current QTM status (enabled/ss3d disabled/unavailable). </p>
<p>Also sets or clear the "blacklisted" flag returned by <a class="el" href="qtm_8h.html#acef0c87052038ce12598aff11ff8e527">QTMU_IsCurrentAppBlacklisted</a>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">qtmStatus</td><td>QTM status to set. If equal to <a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8af714942fcd2b32fa7d17d4baa434af8e">QTM_STATUS_UNAVAILABLE</a>, sets the "blacklisted" flag, otherwise clears it. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xE0E18002</code> if enum value is invalid, otherwise 0 (success). </dd></dl>
<dl class="section note"><dt>Note</dt><dd>System settings uses this to disable super-stable 3D, and NS to "blacklist" (make QTM unavailable) specific applications. </dd></dl>
</div>
</div>
<a id="a708b7eafe8069dcd59d58e2e47dfd509"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a708b7eafe8069dcd59d58e2e47dfd509">&#9670;&nbsp;</a></span>QTMSP_IsExpanderInUse()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMSP_IsExpanderInUse </td>
<td>(</td>
<td class="paramtype">bool *&#160;</td>
<td class="paramname"><em>outActive</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called by GSP's LCD driver to know whether or not QTM's expander thread is using the TI TCA6416A expander; it is waiting for this to become true/false during LCD power on/power off to proceed. </p>
<p>Always false on N2DSXL. </p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outActive</td><td>Where to write the "in use" status to. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
</div>
</div>
<a id="ab5b4018d1f26b729dce93190755d17d1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab5b4018d1f26b729dce93190755d17d1">&#9670;&nbsp;</a></span>QTMSP_NotifyTopLcdModeChange()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMSP_NotifyTopLcdModeChange </td>
<td>(</td>
<td class="paramtype"><a class="el" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a>&#160;</td>
<td class="paramname"><em>newMode</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called by GSP's LCD driver to signal 2D&lt;&gt;3D mode change. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">newMode</td><td>0 for 2D, 1 for 800px 2D (unused for this function, same as 0), 2 for 3D </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
</div>
</div>
<a id="ad7a7cdef8186a82103d490735bd69678"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad7a7cdef8186a82103d490735bd69678">&#9670;&nbsp;</a></span>QTMSP_NotifyTopLcdPowerOff()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMSP_NotifyTopLcdPowerOff </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called by GSP's LCD driver during top LCD power-on to signal to QTM that it needs to switch the parallax barrier state to a 2D state (all-transparent mask). </p>
<p>Causes QTM's expander thread to exit, relinquishing its <code>i2c::QTM</code> session with it. </p><dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
</div>
</div>
<a id="a0e413bd1edd9fdf44de2e22eaca15aab"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0e413bd1edd9fdf44de2e22eaca15aab">&#9670;&nbsp;</a></span>QTMSP_NotifyTopLcdPowerOn()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMSP_NotifyTopLcdPowerOn </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called by GSP's LCD driver during top LCD power-on to signal to QTM that it may power on and/or reconfigure then use the TI TCA6416A expander. </p>
<p>In the process, QTM re-creates its expander thread. </p><dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
</div>
</div>
<a id="a340a4833c1f945ab3fe512f9e37ea048"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a340a4833c1f945ab3fe512f9e37ea048">&#9670;&nbsp;</a></span>QTMU_DisableManualIrLedControl()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_DisableManualIrLedControl </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Temporarily disables manual control of the IR LED by user, re-enabling its automatic control. </p>
<p>If not already done, this also turns off the IR LED. </p><dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
</div>
</div>
<a id="ade8e60b3b7da9156984217cd71b46535"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ade8e60b3b7da9156984217cd71b46535">&#9670;&nbsp;</a></span>QTMU_EnableManualIrLedControl()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_EnableManualIrLedControl </td>
<td>(</td>
<td class="paramtype">void&#160;</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Temporarily enables manual control of the IR LED by user, disabling its automatic control. </p>
<p>If not already done, this also turns off the IR LED. This setting is cleared when user closes the console's shell. </p><dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
</div>
</div>
<a id="a97e8068832dac4c7efc722ddab0d22b7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a97e8068832dac4c7efc722ddab0d22b7">&#9670;&nbsp;</a></span>QTMU_GetRawTrackingData()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static <a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_GetRawTrackingData </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQtmRawTrackingData.html">QtmRawTrackingData</a> *&#160;</td>
<td class="paramname"><em>outData</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the current raw eye tracking data. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outData</td><td>Where to write the raw tracking data to. Cleared to all-zero on failure (instead of being left uninitialized). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18008</code> if camera is in use by user, or <code>0xC8A183EF</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), Otherwise, 0 (success). Return value should be checked by caller. </dd></dl>
<dl class="section note"><dt>Note</dt><dd>Consider using <a class="el" href="qtm_8h.html#a04ef54be757a60f7db0237f51a2db593">QTMU_GetTrackingData</a> instead. </dd></dl>
</div>
</div>
<a id="aa7fc647d83f8f6d13e8c6b10dd6997eb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa7fc647d83f8f6d13e8c6b10dd6997eb">&#9670;&nbsp;</a></span>QTMU_GetRawTrackingDataEx()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_GetRawTrackingDataEx </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQtmRawTrackingData.html">QtmRawTrackingData</a> *&#160;</td>
<td class="paramname"><em>outData</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="types_8h.html#a350c6fc928e3bdc6c6486268ac8fb269">s64</a>&#160;</td>
<td class="paramname"><em>predictionTimePointOrZero</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the current raw eye tracking data, with an optional prediction made for predictionTimePointOrZero = t+dt, or for the current time point (QTM makes predictions based on gyro data since inner camera runs at 30 FPS). </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outData</td><td>Where to write the raw tracking data to. Cleared to all-zero on failure (instead of being left uninitialized). </td></tr>
<tr><td class="paramdir"></td><td class="paramname">predictionTimePointOrZero</td><td>Either zero, or the time point (in system ticks) for which to make a prediction for. Maximum 1 frame (at 30 FPS) in the past, and up to 5 frames in the future. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18008</code> if camera is in use by user, or <code>0xC8A183EF</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL), Otherwise, 0 (success). Return value should be checked by caller. </dd></dl>
<dl class="section note"><dt>Note</dt><dd>Consider using <a class="el" href="qtm_8h.html#acfc5af24bf6ba8bd03f557bf3383083c">QTMU_GetTrackingDataEx</a> instead. </dd></dl>
</div>
</div>
<a id="a04ef54be757a60f7db0237f51a2db593"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a04ef54be757a60f7db0237f51a2db593">&#9670;&nbsp;</a></span>QTMU_GetTrackingData()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static <a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_GetTrackingData </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *&#160;</td>
<td class="paramname"><em>outData</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the current normalized eye tracking data, made suitable for 3D programming. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outData</td><td>Where to write the raw tracking data to. Cleared to all-zero on failure (instead of being left uninitialized). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18008</code> if camera is in use by user, or <code>0xC8A183EF</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL). Otherwise, 0 (success). Return value should be checked by caller. </dd></dl>
<dl class="section note"><dt>Note</dt><dd>This can, for example, be used in games to allow the user to control the scene's camera with their own face. </dd></dl>
</div>
</div>
<a id="acfc5af24bf6ba8bd03f557bf3383083c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#acfc5af24bf6ba8bd03f557bf3383083c">&#9670;&nbsp;</a></span>QTMU_GetTrackingDataEx()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_GetTrackingDataEx </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQtmTrackingData.html">QtmTrackingData</a> *&#160;</td>
<td class="paramname"><em>outData</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="types_8h.html#a350c6fc928e3bdc6c6486268ac8fb269">s64</a>&#160;</td>
<td class="paramname"><em>predictionTimePointOrZero</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Gets the current normalized eye tracking data, made suitable for 3D programming with an optional prediction made for predictionTimePointOrZero = t+dt, or for the current time point (QTM makes predictions based on gyro data since inner camera runs at 30 FPS). </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outData</td><td>Where to write the raw tracking data to. Cleared to all-zero on failure (instead of being left uninitialized). </td></tr>
<tr><td class="paramdir"></td><td class="paramname">predictionTimePointOrZero</td><td>Either zero, or the time point (in system ticks) for which to make a prediction for. Maximum 1 frame (at 30 FPS) in the past, and up to 5 frames in the future. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18008</code> if camera is in use by user, or <code>0xC8A183EF</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL). Otherwise, 0 (success). Return value should be checked by caller. </dd></dl>
<dl class="section note"><dt>Note</dt><dd>This can, for example, be used in games to allow the user to control the scene's camera with their own face. </dd></dl>
</div>
</div>
<a id="acef0c87052038ce12598aff11ff8e527"></a>
<h2 class="memtitle"><span class="permalink"><a href="#acef0c87052038ce12598aff11ff8e527">&#9670;&nbsp;</a></span>QTMU_IsCurrentAppBlacklisted()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_IsCurrentAppBlacklisted </td>
<td>(</td>
<td class="paramtype">bool *&#160;</td>
<td class="paramname"><em>outBlacklisted</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Checks whether or not QTM has been blacklisted, ie. </p>
<p>that it has been made unavailable. In detail, this means that the last call to <a class="el" href="qtm_8h.html#ab3a3f1ad37df943daf7d322f5ed0908d">QTMS_SetQtmStatus</a> was made with argument <a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8af714942fcd2b32fa7d17d4baa434af8e">QTM_STATUS_UNAVAILABLE</a>, usually by NS. This feature seems to only be used for some internal test titles.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">outBlacklisted</td><td>Whether or not QTM is unavailable. Always true on N2DSXL. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Always 0 (success). </dd></dl>
<dl class="section note"><dt>Note</dt><dd>On N2DSXL, even though status is always supposed to be <a class="el" href="qtm_8h.html#a9fa516918f2cb0791396dbf749de78d8af714942fcd2b32fa7d17d4baa434af8e">QTM_STATUS_UNAVAILABLE</a>, this function often returns true (because NS doesn't change QTM's status if title isn't blacklisted). Do not rely on this for N2DSXL detection. </dd>
<dd>
Refer to <a href="https://www.3dbrew.org/wiki/NS_CFA">https://www.3dbrew.org/wiki/NS_CFA</a> for a list of title UIDs this is used for. </dd></dl>
</div>
</div>
<a id="a2915cfd8b8553570516f71b0f169b9f7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2915cfd8b8553570516f71b0f169b9f7">&#9670;&nbsp;</a></span>QTMU_SetIrLedStatus()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> QTMU_SetIrLedStatus </td>
<td>(</td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>on</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Turns the IR LED on or off during manual control. </p>
<p><a class="el" href="qtm_8h.html#ade8e60b3b7da9156984217cd71b46535">QTMU_EnableManualIrLedControl</a> must have been called.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">on</td><td>Whether to turn the IR LED on or off. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd><code>0xC8A18005</code> if manual control was not enabled or if the operation failed, <code>0xC8A18008</code> if camera is in use by user, or <code>0xC8A18009</code> if QTM is unavailable (in particular, QTM is always unavailable on N2DSXL). Otherwise, 0 (success). </dd></dl>
</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
</small></address>
</body>
</html>