# 架构

Note

- 要继续阅读有关 API 或部署传感器的信息，直接跳至[接口](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-7/qsh_api_reference.html)。
- 低功耗应用数字信号处理器 (aDSP) 的源代码（包括 QSH 框架）仅供具有授权访问权限的许可用户使用。要升级您的访问权限，前往 [www.qualcomm.com/support/working-with-qualcomm](https://www.qualcomm.com/support/working-with-qualcomm)。

QSH 与 Qualcomm® Snapdragon™ 传感器核心 (SSC) 同义，它为驱动程序和算法提供一个统一的事件驱动框架。QSH 支持基于硬件和基于软件的传感器的同一组 API。此外，QSH 支持异步总线传输，并且可轻松扩展，以获得新的或自定义驱动程序功能。QSH 由各种组件组成，包括 QSH 客户端 API、传感器 API、核心框架、预实现的平台传感器、供应商实现的传感器和测试模块。它为外部客户端提供服务，并提供一个简单的界面来访问传感器数据。

下表描述了 QSH 框架中使用的术语：

表：QSH 术语

| **项目** | **说明** |
| --- | --- |
| 传感器 | <ul class="simple"><br><li><p>生成单一类型数据，例如，加速度计、陀螺仪、定时器、中断、旋转矢量等</p></li><br><li><p>处理异步数据</p></li><br><li><p>发布必需属性和自定义属性，并管理其实例</p></li><br></ul> |
| 传感器实例 | <ul class="simple"><br><li><p>在特定配置下运行，发布输出数据事件，并且可以按客户端请求创建或在多个请求之间共享</p></li><br><li><p>物理传感器通常共享单一实例</p></li><br></ul> |
| 传感器唯一标识符 (SUID) | 每个传感器唯一的 128 位 ID |
| 服务 | 为通用实用工具提供同步接口的模块 |
| 数据流 | 客户端与数据源间的唯一连接 |
| 请求 | 客户端发送至传感器的配置消息（请参阅 `sns_request.h` 文件） |
| 活动 | 传感器实例生成的异步输出数据消息（请参阅 `sns_sensor_event.h` 文件） |
| Nanopb | 用 ANSI C 实现的小代码量协议缓存 |

QSH 架构的组件如下图所示：

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- 由 Microsoft Visio, SVG Export 生成 qsh-architecture3.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.215in" height="7.44601in" viewbox="0 0 735.48 536.113" xml:space="preserve" color-interpolation-filters="sRGB" class="st39"><v:documentproperties v:langid="2052">	<v:userdefs>		<v:ud v:nameu="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"></v:ud>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #f7f8fa; stroke: none; stroke-width: 0.25 }
.svg-1 .st2 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st3 { fill: #ffffff; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st4 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st5 { fill: #13161e; font-family: Arial; font-size: 1.07398em; font-weight: bold }
.svg-1 .st6 { font-family: SimHei; font-size: 1em }
.svg-1 .st7 { fill: #3253dc; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.916033 }
.svg-1 .st8 { fill: #f7f8fa; font-family: SimHei; font-size: 0.966591em }
.svg-1 .st9 { fill: #4a5a75; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st10 { fill: #f7f8fa; font-family: SimHei; font-size: 1.23507em }
.svg-1 .st11 { fill: #39a3b5; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st12 { fill: #f7f8fa; font-family: Arial; font-size: 1.23507em }
.svg-1 .st13 { fill: #0b2742; font-family: SimHei; font-size: 1.23507em; font-weight: bold }
.svg-1 .st14 { font-family: Arial; font-size: 1em }
.svg-1 .st15 { font-size: 1em }
.svg-1 .st16 { fill: #13161e; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.0398275 }
.svg-1 .st17 { fill: none; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st18 { fill: #4a5a75; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.916033 }
.svg-1 .st19 { fill: #f7f8fa; font-family: SimHei; font-size: 0.96666em }
.svg-1 .st20 { fill: #3253dc; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.916033 }
.svg-1 .st21 { fill: #13161e; font-family: SimHei; font-size: 1.07398em; font-weight: bold }
.svg-1 .st22 { fill: #0b2742; font-family: Arial; font-size: 1.23507em; font-weight: bold }
.svg-1 .st23 { fill: #feffff; font-family: Arial; font-size: 1.20767em }
.svg-1 .st24 { fill: #f7f8fa; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st25 { fill: #f7f8fa; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st26 { fill: none; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.79655 }
.svg-1 .st27 { fill: #dee3ec; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st28 { fill: #000000; font-family: SimHei; font-size: 0.833336em }
.svg-1 .st29 { fill: #13161e; font-family: SimHei; font-size: 0.833336em }
.svg-1 .st30 { fill: #f7f8fa; font-family: Arial; font-size: 0.966591em }
.svg-1 .st31 { fill: #dee3ec; stroke: none; stroke-width: 2 }
.svg-1 .st32 { fill: #4a5a75; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st33 { fill: #feffff; font-family: SimHei; font-size: 1.00001em }
.svg-1 .st34 { fill: #39a3b5; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st35 { fill: #3253dc; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st36 { fill: #feffff; font-family: Arial; font-size: 1.00001em }
.svg-1 .st37 { fill: #dee3ec; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st38 { fill: #000000; font-family: SimHei; font-size: 1.00001em }
.svg-1 .st39 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(112.502,-0.00047)">		<title>工作表.1</title>		<rect x="0" y="-3.887" width="616.5" height="540" class="st1"></rect>	</g>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(194.763,-182.924)">		<title>工作表.2</title>		<path d="M0 389.51 C0 373.32 12.84 360.19 28.67 360.19 L485.49 360.19 C501.36 360.19 514.15 373.32 514.15 389.51 L514.15					 506.79 C514.15 523.02 501.36 536.11 485.49 536.11 L28.67 536.11 C12.84 536.11 0 523.02 0 506.79 L0 389.51					 Z" class="st2"></path>	</g>	<g id="shape3-5" v:mid="3" v:groupcontext="shape" transform="translate(194.763,-182.924)">		<title>工作表.3</title>		<path d="M0 389.51 C0 373.32 12.84 360.19 28.67 360.19 L485.49 360.19 C501.36 360.19 514.15 373.32 514.15 389.51 L514.15					 506.79 C514.15 523.02 501.36 536.11 485.49 536.11 L28.67 536.11 C12.84 536.11 0 523.02 0 506.79 L0 389.51					 Z" class="st3"></path>	</g>	<g id="shape4-7" v:mid="4" v:groupcontext="shape" transform="translate(210.588,-333.373)">		<title>工作表.4</title>		<desc>Qualcomm Sensing Hub</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="82.2678" cy="528.381" width="164.54" height="15.4689"></v:textrect>		<rect x="0" y="520.643" width="164.54" height="15.47" class="st4"></rect>		<text x="14.83" y="532.57" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Qualcomm <tspan class="st6">传感器中枢</tspan></text>		</g>	<g id="shape5-11" v:mid="5" v:groupcontext="shape" transform="translate(507.917,-296.336)">		<title>工作表.5</title>		<path d="M0 513.04 C0 510.5 2.05 508.4 4.53 508.4 L158.7 508.4 C161.19 508.4 163.19 510.5 163.19 513.04 L163.19 531.52					 C163.19 534.06 161.19 536.11 158.7 536.11 L4.53 536.11 C2.05 536.11 0 534.06 0 531.52 L0 513.04 Z" class="st2"></path>	</g>	<g id="shape6-13" v:mid="6" v:groupcontext="shape" transform="translate(507.917,-296.336)">		<title>工作表.6</title>		<path d="M0 513.04 C0 510.5 2.05 508.4 4.53 508.4 L158.7 508.4 C161.19 508.4 163.19 510.5 163.19 513.04 L163.19 531.52					 C163.19 534.06 161.19 536.11 158.7 536.11 L4.53 536.11 C2.05 536.11 0 534.06 0 531.52 L0 513.04 Z" class="st7"></path>	</g>	<g id="shape7-15" v:mid="7" v:groupcontext="shape" transform="translate(551.063,-301.886)">		<title>工作表.7</title>		<desc>Client Manager</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="46.9964" cy="529.154" width="94" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="94" height="13.92" class="st4"></rect>		<text x="12.2" y="532.92" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>客户端管理器</text>		</g>	<g id="shape8-18" v:mid="8" v:groupcontext="shape" transform="translate(194.763,-473.717)">		<title>工作表.8</title>		<path d="M0 510.9 C0 508.12 2.24 505.83 4.96 505.83 L509.23 505.83 C511.95 505.83 514.15 508.12 514.15 510.9 L514.15					 531.08 C514.15 533.86 511.95 536.11 509.23 536.11 L4.96 536.11 C2.24 536.11 0 533.86 0 531.08 L0 510.9 Z" class="st9"></path>	</g>	<g id="shape9-20" v:mid="9" v:groupcontext="shape" transform="translate(393.985,-477.492)">		<title>工作表.9</title>		<desc>Client Application</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="68.2561" cy="527.221" width="136.52" height="17.7886"></v:textrect>		<rect x="0" y="518.323" width="136.52" height="17.79" class="st4"></rect>		<text x="16.38" y="532.04" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>客户端应用程序</text>		</g>	<g id="shape10-23" v:mid="10" v:groupcontext="shape" transform="translate(194.763,-419.866)">		<title>工作表.10</title>		<path d="M0 510.9 C0 508.12 2.24 505.83 4.96 505.83 L509.23 505.83 C511.95 505.83 514.15 508.12 514.15 510.9 L514.15					 531.08 C514.15 533.86 511.95 536.11 509.23 536.11 L4.96 536.11 C2.24 536.11 0 533.86 0 531.08 L0 510.9 Z" class="st11"></path>	</g>	<g id="shape11-25" v:mid="11" v:groupcontext="shape" transform="translate(400.286,-423.214)">		<title>工作表.11</title>		<desc>QSH Client API</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="60.9442" cy="527.221" width="121.9" height="17.7886"></v:textrect>		<rect x="0" y="518.323" width="121.89" height="17.79" class="st4"></rect>		<text x="6.59" y="532.04" class="st12" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>QSH <tspan class="st6">客户端</tspan> API</text>		</g>	<g id="shape12-29" v:mid="12" v:groupcontext="shape" transform="translate(-352.255,135.613) rotate(-90)">		<title>工作表.12</title>		<desc>Application processor</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="70.2367" cy="508.019" width="140.48" height="56.1935"></v:textrect>		<rect x="0" y="479.923" width="140.48" height="56.19" class="st4"></rect>		<text x="55.36" y="503.2" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>应用<tspan class="st14"> </tspan><tspan x="47.92" dy="1.3em" class="st15">处理器</tspan></text>		</g>	<g id="shape13-34" v:mid="13" v:groupcontext="shape" transform="translate(-369.825,376.25) rotate(-90)">		<title>工作表.13</title>		<desc>Low power processor</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="83.1358" cy="527.221" width="166.28" height="17.7886"></v:textrect>		<rect x="0" y="518.323" width="166.28" height="17.79" class="st4"></rect>		<text x="38.5" y="532.04" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>低功耗处理器</text>		</g>	<g id="shape14-37" v:mid="14" v:groupcontext="shape" transform="translate(127.667,-394.674)">		<title>工作表.14</title>		<path d="M0 534.78 L8.86 534.78 L8.86 536.11 L0 536.11 L0 534.78 ZM12.18 534.78 L21.05 534.78 L21.05 536.11 L12.18 536.11					 L12.18 534.78 ZM24.37 534.78 L33.2 534.78 L33.2 536.11 L24.37 536.11 L24.37 534.78 ZM36.52 534.78 L45.38					 534.78 L45.38 536.11 L36.52 536.11 L36.52 534.78 ZM48.7 534.78 L57.57 534.78 L57.57 536.11 L48.7 536.11					 L48.7 534.78 ZM60.89 534.78 L69.72 534.78 L69.72 536.11 L60.89 536.11 L60.89 534.78 ZM73.04 534.78 L81.9					 534.78 L81.9 536.11 L73.04 536.11 L73.04 534.78 ZM85.22 534.78 L94.09 534.78 L94.09 536.11 L85.22 536.11					 L85.22 534.78 ZM97.41 534.78 L106.24 534.78 L106.24 536.11 L97.41 536.11 L97.41 534.78 ZM109.56 534.78 L118.42					 534.78 L118.42 536.11 L109.56 536.11 L109.56 534.78 ZM121.74 534.78 L130.61 534.78 L130.61 536.11 L121.74					 536.11 L121.74 534.78 ZM133.93 534.78 L142.76 534.78 L142.76 536.11 L133.93 536.11 L133.93 534.78 ZM146.08					 534.78 L154.94 534.78 L154.94 536.11 L146.08 536.11 L146.08 534.78 ZM158.26 534.78 L167.13 534.78 L167.13					 536.11 L158.26 536.11 L158.26 534.78 ZM170.45 534.78 L179.28 534.78 L179.28 536.11 L170.45 536.11 L170.45					 534.78 ZM182.6 534.78 L191.46 534.78 L191.46 536.11 L182.6 536.11 L182.6 534.78 ZM194.78 534.78 L203.65					 534.78 L203.65 536.11 L194.78 536.11 L194.78 534.78 ZM206.97 534.78 L215.8 534.78 L215.8 536.11 L206.97					 536.11 L206.97 534.78 ZM219.12 534.78 L227.98 534.78 L227.98 536.11 L219.12 536.11 L219.12 534.78 ZM231.3					 534.78 L240.17 534.78 L240.17 536.11 L231.3 536.11 L231.3 534.78 ZM243.49 534.78 L252.32 534.78 L252.32					 536.11 L243.49 536.11 L243.49 534.78 ZM255.64 534.78 L264.5 534.78 L264.5 536.11 L255.64 536.11 L255.64					 534.78 ZM267.82 534.78 L276.69 534.78 L276.69 536.11 L267.82 536.11 L267.82 534.78 ZM280.01 534.78 L288.84					 534.78 L288.84 536.11 L280.01 536.11 L280.01 534.78 ZM292.16 534.78 L301.02 534.78 L301.02 536.11 L292.16					 536.11 L292.16 534.78 ZM304.34 534.78 L313.21 534.78 L313.21 536.11 L304.34 536.11 L304.34 534.78 ZM316.53					 534.78 L325.36 534.78 L325.36 536.11 L316.53 536.11 L316.53 534.78 ZM328.68 534.78 L337.54 534.78 L337.54					 536.11 L328.68 536.11 L328.68 534.78 ZM340.86 534.78 L349.73 534.78 L349.73 536.11 L340.86 536.11 L340.86					 534.78 ZM353.05 534.78 L361.88 534.78 L361.88 536.11 L353.05 536.11 L353.05 534.78 ZM365.2 534.78 L374.06					 534.78 L374.06 536.11 L365.2 536.11 L365.2 534.78 ZM377.38 534.78 L386.25 534.78 L386.25 536.11 L377.38					 536.11 L377.38 534.78 ZM389.57 534.78 L398.4 534.78 L398.4 536.11 L389.57 536.11 L389.57 534.78 ZM401.72					 534.78 L410.58 534.78 L410.58 536.11 L401.72 536.11 L401.72 534.78 ZM413.9 534.78 L422.77 534.78 L422.77					 536.11 L413.9 536.11 L413.9 534.78 ZM426.09 534.78 L434.92 534.78 L434.92 536.11 L426.09 536.11 L426.09					 534.78 ZM438.24 534.78 L447.1 534.78 L447.1 536.11 L438.24 536.11 L438.24 534.78 ZM450.42 534.78 L459.29					 534.78 L459.29 536.11 L450.42 536.11 L450.42 534.78 ZM462.61 534.78 L471.44 534.78 L471.44 536.11 L462.61					 536.11 L462.61 534.78 ZM474.76 534.78 L483.62 534.78 L483.62 536.11 L474.76 536.11 L474.76 534.78 ZM486.94					 534.78 L495.8 534.78 L495.8 536.11 L486.94 536.11 L486.94 534.78 ZM499.12 534.78 L507.96 534.78 L507.96					 536.11 L499.12 536.11 L499.12 534.78 ZM511.28 534.78 L520.14 534.78 L520.14 536.11 L511.28 536.11 L511.28					 534.78 ZM523.46 534.78 L532.32 534.78 L532.32 536.11 L523.46 536.11 L523.46 534.78 ZM535.64 534.78 L544.48					 534.78 L544.48 536.11 L535.64 536.11 L535.64 534.78 ZM547.8 534.78 L556.66 534.78 L556.66 536.11 L547.8					 536.11 L547.8 534.78 ZM559.98 534.78 L568.84 534.78 L568.84 536.11 L559.98 536.11 L559.98 534.78 ZM572.16					 534.78 L581 534.78 L581 536.11 L572.16 536.11 L572.16 534.78 ZM584.32 534.78 L588.93 534.78 L588.93 536.11					 L584.32 536.11 L584.32 534.78 Z" class="st16"></path>	</g>	<g id="shape15-39" v:mid="15" v:groupcontext="shape" transform="translate(581.008,-447.297)">		<title>工作表.15</title>		<path d="M0 519.04 L8.51 510.34 L17.01 519.04 L12.76 519.04 L12.76 527.41 L17.01 527.41 L8.51 536.11 L0 527.41 L4.25					 527.41 L4.25 519.04 L0 519.04 Z" class="st17"></path>	</g>	<g id="shape16-41" v:mid="16" v:groupcontext="shape" transform="translate(236.979,-213.854)">		<title>工作表.16</title>		<path d="M0 502.28 C0 498.58 2.99 495.52 6.62 495.52 L86.64 495.52 C90.3 495.52 93.25 498.58 93.25 502.28 L93.25 529.35					 C93.25 533.09 90.3 536.11 86.64 536.11 L6.62 536.11 C2.99 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st2"></path>	</g>	<g id="shape17-43" v:mid="17" v:groupcontext="shape" transform="translate(225.874,-213.854)">		<title>工作表.17</title>		<path d="M0 502.28 C0 498.58 3.35 495.52 7.4 495.52 L96.95 495.52 C101.05 495.52 104.36 498.58 104.36 502.28 L104.36					 529.35 C104.36 533.09 101.05 536.11 96.95 536.11 L7.4 536.11 C3.35 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st18"></path>	</g>	<g id="shape18-45" v:mid="18" v:groupcontext="shape" transform="translate(232.568,-208.055)">		<title>工作表.18</title>		<path d="M0 502.28 C0 498.58 2.99 495.52 6.62 495.52 L86.01 495.52 C89.67 495.52 92.62 498.58 92.62 502.28 L92.62 529.35					 C92.62 533.09 89.67 536.11 86.01 536.11 L6.62 536.11 C2.99 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st2"></path>	</g>	<g id="shape19-47" v:mid="19" v:groupcontext="shape" transform="translate(222.675,-208.055)">		<title>工作表.19</title>		<path d="M0 502.28 C0 498.58 3.35 495.52 7.4 495.52 L96.25 495.52 C100.35 495.52 103.65 498.58 103.65 502.28 L103.65					 529.35 C103.65 533.09 100.35 536.11 96.25 536.11 L7.4 536.11 C3.35 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st18"></path>	</g>	<g id="shape20-49" v:mid="20" v:groupcontext="shape" transform="translate(228.158,-200.967)">		<title>工作表.20</title>		<path d="M0 502.28 C0 498.58 2.99 495.52 6.62 495.52 L86.64 495.52 C90.3 495.52 93.25 498.58 93.25 502.28 L93.25 529.35					 C93.25 533.09 90.3 536.11 86.64 536.11 L6.62 536.11 C2.99 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st2"></path>	</g>	<g id="shape21-51" v:mid="21" v:groupcontext="shape" transform="translate(217.823,-200.967)">		<title>工作表.21</title>		<path d="M0 502.28 C0 498.58 3.35 495.52 7.4 495.52 L96.95 495.52 C101.05 495.52 104.36 498.58 104.36 502.28 L104.36					 529.35 C104.36 533.09 101.05 536.11 96.95 536.11 L7.4 536.11 C3.35 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st18"></path>	</g>	<g id="shape22-53" v:mid="22" v:groupcontext="shape" transform="translate(225.002,-223.056)">		<title>工作表.22</title>		<desc>Hardware Based</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="44.2811" cy="530.314" width="88.57" height="11.6025"></v:textrect>		<rect x="0" y="524.513" width="88.57" height="11.6" class="st4"></rect>		<text x="15.28" y="534.08" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>基于硬件的  </text>		</g>	<g id="shape23-56" v:mid="23" v:groupcontext="shape" transform="translate(228.068,-208.255)">		<title>工作表.23</title>		<desc>Sensor Drivers</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="41.0066" cy="530.314" width="82.02" height="11.6025"></v:textrect>		<rect x="0" y="524.513" width="82.02" height="11.6" class="st4"></rect>		<text x="0.41" y="534.08" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>传感器驱动程序</text>		</g>	<g id="shape24-59" v:mid="24" v:groupcontext="shape" transform="translate(236.979,-284.737)">		<title>工作表.24</title>		<path d="M0 502.28 C0 498.58 2.99 495.52 6.62 495.52 L86.64 495.52 C90.3 495.52 93.25 498.58 93.25 502.28 L93.25 529.35					 C93.25 533.09 90.3 536.11 86.64 536.11 L6.62 536.11 C2.99 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st2"></path>	</g>	<g id="shape25-61" v:mid="25" v:groupcontext="shape" transform="translate(225.874,-284.737)">		<title>工作表.25</title>		<path d="M0 502.28 C0 498.58 3.35 495.52 7.4 495.52 L96.95 495.52 C101.05 495.52 104.36 498.58 104.36 502.28 L104.36					 529.35 C104.36 533.09 101.05 536.11 96.95 536.11 L7.4 536.11 C3.35 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st20"></path>	</g>	<g id="shape26-63" v:mid="26" v:groupcontext="shape" transform="translate(232.568,-278.938)">		<title>工作表.26</title>		<path d="M0 502.28 C0 498.58 2.99 495.52 6.62 495.52 L86.01 495.52 C89.67 495.52 92.62 498.58 92.62 502.28 L92.62 529.35					 C92.62 533.09 89.67 536.11 86.01 536.11 L6.62 536.11 C2.99 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st2"></path>	</g>	<g id="shape27-65" v:mid="27" v:groupcontext="shape" transform="translate(222.675,-278.938)">		<title>工作表.27</title>		<path d="M0 502.28 C0 498.58 3.35 495.52 7.4 495.52 L96.25 495.52 C100.35 495.52 103.65 498.58 103.65 502.28 L103.65					 529.35 C103.65 533.09 100.35 536.11 96.25 536.11 L7.4 536.11 C3.35 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st20"></path>	</g>	<g id="shape28-67" v:mid="28" v:groupcontext="shape" transform="translate(228.158,-272.494)">		<title>工作表.28</title>		<path d="M0 502.28 C0 498.58 2.99 495.52 6.62 495.52 L86.64 495.52 C90.3 495.52 93.25 498.58 93.25 502.28 L93.25 529.35					 C93.25 533.09 90.3 536.11 86.64 536.11 L6.62 536.11 C2.99 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st2"></path>	</g>	<g id="shape29-69" v:mid="29" v:groupcontext="shape" transform="translate(217.823,-272.494)">		<title>工作表.29</title>		<path d="M0 502.28 C0 498.58 3.35 495.52 7.4 495.52 L96.95 495.52 C101.05 495.52 104.36 498.58 104.36 502.28 L104.36					 529.35 C104.36 533.09 101.05 536.11 96.95 536.11 L7.4 536.11 C3.35 536.11 0 533.09 0 529.35 L0 502.28 Z" class="st20"></path>	</g>	<g id="shape30-71" v:mid="30" v:groupcontext="shape" transform="translate(227.879,-280.8)">		<title>工作表.30</title>		<desc>Software Based</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="42.1208" cy="524.488" width="84.25" height="23.2589"></v:textrect>		<rect x="0" y="512.859" width="84.25" height="23.2538" class="st4"></rect>		<text x="13.12" y="520.72" class="st19" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>基于软件的<v:lf></v:lf><tspan x="24.72" dy="1.3em" class="st15">传感器</tspan>  </text>		</g>	<g id="shape32-75" v:mid="32" v:groupcontext="shape" transform="translate(194.763,-111.396)">		<title>工作表.32</title>		<path d="M0 487.26 C0 481.86 4.29 477.47 9.57 477.47 L504.62 477.47 C509.9 477.47 514.15 481.86 514.15 487.26 L514.15					 526.37 C514.15 531.76 509.9 536.11 504.62 536.11 L9.57 536.11 C4.29 536.11 0 531.76 0 526.37 L0 487.26 Z" class="st2"></path>	</g>	<g id="shape33-77" v:mid="33" v:groupcontext="shape" transform="translate(194.763,-111.396)">		<title>工作表.33</title>		<path d="M0 487.26 C0 481.86 4.29 477.47 9.57 477.47 L504.62 477.47 C509.9 477.47 514.15 481.86 514.15 487.26 L514.15					 526.37 C514.15 531.76 509.9 536.11 504.62 536.11 L9.57 536.11 C4.29 536.11 0 531.76 0 526.37 L0 487.26 Z" class="st3"></path>	</g>	<g id="shape34-79" v:mid="34" v:groupcontext="shape" transform="translate(204.992,-150.512)">		<title>工作表.34</title>		<desc>Serial Buses</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="43.6128" cy="528.381" width="87.23" height="15.4689"></v:textrect>		<rect x="0" y="520.643" width="87.23" height="15.47" class="st4"></rect>		<text x="17.74" y="532.57" class="st21" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>串行总线</text>		</g>	<g id="shape35-82" v:mid="35" v:groupcontext="shape" transform="translate(507.917,-249.94)">		<title>工作表.35</title>		<path d="M0 510.9 C0 508.12 2.24 505.83 4.96 505.83 L67.54 505.83 C70.26 505.83 72.46 508.12 72.46 510.9 L72.46 531.08					 C72.46 533.86 70.26 536.11 67.54 536.11 L4.96 536.11 C2.24 536.11 0 533.86 0 531.08 L0 510.9 Z" class="st2"></path>	</g>	<g id="shape36-84" v:mid="36" v:groupcontext="shape" transform="translate(507.917,-249.94)">		<title>工作表.36</title>		<path d="M0 510.9 C0 508.12 2.24 505.83 4.96 505.83 L67.54 505.83 C70.26 505.83 72.46 508.12 72.46 510.9 L72.46 531.08					 C72.46 533.86 70.26 536.11 67.54 536.11 L4.96 536.11 C2.24 536.11 0 533.86 0 531.08 L0 510.9 Z" class="st7"></path>	</g>	<g id="shape37-86" v:mid="37" v:groupcontext="shape" transform="translate(511.2,-252)">		<title>工作表.37</title>		<desc>Platform</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="32.3878" cy="523.457" width="64.79" height="25.3194"></v:textrect>		<rect x="0" y="510.798" width="64.7774" height="25.3149" class="st4"></rect>		<text x="3.39" y="527.23" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>平台传感器  </text>		</g>	<g id="shape39-89" v:mid="39" v:groupcontext="shape" transform="translate(553.284,-202.9)">		<title>工作表.39</title>		<path d="M0 510.9 C0 508.12 2.24 505.83 4.96 505.83 L67.54 505.83 C70.26 505.83 72.46 508.12 72.46 510.9 L72.46 531.08					 C72.46 533.86 70.26 536.11 67.54 536.11 L4.96 536.11 C2.24 536.11 0 533.86 0 531.08 L0 510.9 Z" class="st2"></path>	</g>	<g id="shape40-91" v:mid="40" v:groupcontext="shape" transform="translate(553.284,-201.867)">		<title>工作表.40</title>		<path d="M0 510.36 C0 507.53 2.24 505.18 4.96 505.18 L67.54 505.18 C70.26 505.18 72.46 507.53 72.46 510.36 L72.46 530.97					 C72.46 533.81 70.26 536.11 67.54 536.11 L4.96 536.11 C2.24 536.11 0 533.81 0 530.97 L0 510.36 Z" class="st7"></path>	</g>	<g id="shape41-93" v:mid="41" v:groupcontext="shape" transform="translate(554.4,-209.28)">		<title>工作表.41</title>		<desc>Service</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="35.996" cy="529.154" width="72" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="72" height="13.92" class="st4"></rect>		<text x="7" y="532.92" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>服务管理器  </text>		</g>	<g id="shape43-96" v:mid="43" v:groupcontext="shape" transform="translate(204.825,-505.729)">		<title>工作表.43</title>		<desc>Linux OS</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="55.9816" cy="527.221" width="111.98" height="17.7886"></v:textrect>		<rect x="0" y="518.323" width="111.975" height="17.79" class="st4"></rect>		<text x="4.4" y="532.04" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Linux <tspan class="st6">操作系统</tspan></text>		</g>	<g id="shape44-100" v:mid="44" v:groupcontext="shape" transform="translate(204.825,-364.101)">		<title>工作表.44</title>		<desc>QuRT</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="55.983" cy="527.221" width="111.98" height="17.7886"></v:textrect>		<rect x="0" y="518.323" width="111.975" height="17.79" class="st4"></rect>		<text x="4" y="532.04" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>QuRT<tspan class="st15" v:langid="2052"> </tspan><tspan class="st6">操作系统</tspan></text>		</g>	<g id="shape46-105" v:mid="46" v:groupcontext="shape" transform="translate(187.832,-401.426)">		<title>工作表.46</title>		<rect x="0" y="406.923" width="528.65" height="129.19" class="st17"></rect>	</g>	<g id="shape47-107" v:mid="47" v:groupcontext="shape" transform="translate(598.651,-249.94)">		<title>工作表.47</title>		<path d="M0 510.9 C0 508.12 2.24 505.83 4.96 505.83 L67.54 505.83 C70.26 505.83 72.46 508.12 72.46 510.9 L72.46 531.08					 C72.46 533.86 70.26 536.11 67.54 536.11 L4.96 536.11 C2.24 536.11 0 533.86 0 531.08 L0 510.9 Z" class="st2"></path>	</g>	<g id="shape48-109" v:mid="48" v:groupcontext="shape" transform="translate(598.651,-249.94)">		<title>工作表.48</title>		<path d="M0 510.9 C0 508.12 2.24 505.83 4.96 505.83 L67.54 505.83 C70.26 505.83 72.46 508.12 72.46 510.9 L72.46 531.08					 C72.46 533.86 70.26 536.11 67.54 536.11 L4.96 536.11 C2.24 536.11 0 533.86 0 531.08 L0 510.9 Z" class="st7"></path>	</g>	<g id="shape49-111" v:mid="49" v:groupcontext="shape" transform="translate(604.8,-256.948)">		<title>工作表.49</title>		<desc>Utilities</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="29.3779" cy="529.154" width="58.77" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="58.7633" height="13.92" class="st4"></rect>		<text x="17.78" y="532.92" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>工具</text>		</g>	<g id="shape50-114" v:mid="50" v:groupcontext="shape" transform="translate(403.952,-193.234)">		<title>工作表.50</title>		<path d="M3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 399.5 C0 397.37 1.69 395.64 3.78 395.64 L18.9 395.64 C20.99 395.64					 22.68 397.37 22.68 399.5 L22.68 532.25 C22.68 534.38 20.99 536.11 18.9 536.11 L3.78 536.11 Z" class="st7"></path>	</g>	<g id="shape51-116" v:mid="51" v:groupcontext="shape" transform="translate(-111.708,334.249) rotate(-90)">		<title>工作表.51</title>		<desc>QSH Sensor API</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="64.593" cy="527.418" width="129.19" height="17.3941"></v:textrect>		<rect x="0" y="518.723" width="129.19" height="17.39" class="st4"></rect>		<text x="11.45" y="532.13" class="st23" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>QSH <tspan class="st6">传感器</tspan> API</text>		</g>	<g id="shape52-120" v:mid="52" v:groupcontext="shape" transform="translate(499.726,-193.234)">		<title>工作表.52</title>		<rect x="0" y="395.643" width="179.58" height="140.47" class="st17"></rect>	</g>	<g id="shape53-122" v:mid="53" v:groupcontext="shape" transform="translate(581.008,-322.756)">		<title>工作表.53</title>		<path d="M0 446.28 L8.51 435.87 L17.01 446.28 L12.76 446.28 L12.76 525.7 L17.01 525.7 L8.51 536.11 L0 525.7 L4.25 525.7					 L4.25 446.28 L0 446.28 Z" class="st24"></path>	</g>	<g id="shape54-124" v:mid="54" v:groupcontext="shape" transform="translate(330.863,-289.892)">		<title>工作表.54</title>		<path d="M63.64 518.07 L72.46 527.09 L63.64 536.11 L63.64 531.6 L8.82 531.6 L8.82 536.11 L0 527.09 L8.82 518.07 L8.82					 522.58 L63.64 522.58 L63.64 518.07 Z" class="st2"></path>	</g>	<g id="shape55-126" v:mid="55" v:groupcontext="shape" transform="translate(330.863,-289.892)">		<title>工作表.55</title>		<path d="M63.64 518.07 L72.46 527.09 L63.64 536.11 L63.64 531.6 L8.82 531.6 L8.82 536.11 L0 527.09 L8.82 518.07 L8.82					 522.58 L63.64 522.58 L63.64 518.07 Z" class="st17"></path>	</g>	<g id="shape56-128" v:mid="56" v:groupcontext="shape" transform="translate(427.266,-254.451)">		<title>工作表.56</title>		<path d="M63.64 518.07 L72.46 527.09 L63.64 536.11 L63.64 531.6 L8.82 531.6 L8.82 536.11 L0 527.09 L8.82 518.07 L8.82					 522.58 L63.64 522.58 L63.64 518.07 Z" class="st2"></path>	</g>	<g id="shape57-130" v:mid="57" v:groupcontext="shape" transform="translate(427.266,-254.451)">		<title>工作表.57</title>		<path d="M63.64 518.07 L72.46 527.09 L63.64 536.11 L63.64 531.6 L8.82 531.6 L8.82 536.11 L0 527.09 L8.82 518.07 L8.82					 522.58 L63.64 522.58 L63.64 518.07 Z" class="st17"></path>	</g>	<g id="shape58-132" v:mid="58" v:groupcontext="shape" transform="translate(270.374,-170.68)">		<title>工作表.58</title>		<path d="M0 514.2 L8.82 505.18 L17.64 514.2 L13.23 514.2 L13.23 527.09 L17.64 527.09 L8.82 536.11 L0 527.09 L4.41 527.09					 L4.41 514.2 L0 514.2 Z" class="st25"></path>	</g>	<g id="shape59-134" v:mid="59" v:groupcontext="shape" transform="translate(270.374,-170.68)">		<title>工作表.59</title>		<path d="M0 514.2 L8.82 505.18 L17.64 514.2 L13.23 514.2 L13.23 527.09 L17.64 527.09 L8.82 536.11 L0 527.09 L4.41 527.09					 L4.41 514.2 L0 514.2 Z" class="st26"></path>	</g>	<g id="shape60-136" v:mid="60" v:groupcontext="shape" transform="translate(330.863,-219.009)">		<title>工作表.60</title>		<path d="M63.95 518.71 L72.46 527.41 L63.95 536.11 L63.95 531.76 L8.51 531.76 L8.51 536.11 L0 527.41 L8.51 518.71 L8.51					 523.06 L63.95 523.06 L63.95 518.71 Z" class="st2"></path>	</g>	<g id="shape61-138" v:mid="61" v:groupcontext="shape" transform="translate(330.863,-219.009)">		<title>工作表.61</title>		<path d="M63.95 518.71 L72.46 527.41 L63.95 536.11 L63.95 531.76 L8.51 531.76 L8.51 536.11 L0 527.41 L8.51 518.71 L8.51					 523.06 L63.95 523.06 L63.95 518.71 Z" class="st17"></path>	</g>	<g id="shape62-140" v:mid="62" v:groupcontext="shape" transform="translate(187.832,-36.003)">		<title>工作表.62</title>		<rect x="0" y="472.963" width="528.65" height="63.15" class="st17"></rect>	</g>	<g id="shape63-142" v:mid="63" v:groupcontext="shape" transform="translate(402.085,-37.2568)">		<title>工作表.63</title>		<desc>Sensor Hardware</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="59.5988" cy="524.517" width="119.21" height="23.198"></v:textrect>		<rect x="0" y="512.913" width="119.2" height="23.2" class="st4"></rect>		<text x="27.25" y="528.71" class="st21" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>传感器硬件</text>		</g>	<g id="shape64-145" v:mid="64" v:groupcontext="shape" transform="translate(200.434,-61.1342)">		<title>Rounded Rectangle</title>		<desc>Accelerometer</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45.3649" cy="523.228" width="90.74" height="25.7756"></v:textrect>		<path d="M9.07 536.11 L81.66 536.11 A9.07317 9.07317 -180 0 0 90.73 527.04 L90.73 519.41 A9.07317 9.07317 -180 0 0 81.66					 510.34 L9.07 510.34 A9.07317 9.07317 -180 0 0 -0 519.41 L0 527.04 A9.07317 9.07317 -180 0 0 9.07 536.11					 Z" class="st27"></path>		<text x="15.36" y="526.48" class="st28" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>加速度传感器</text>		</g>	<g id="shape65-148" v:mid="65" v:groupcontext="shape" transform="translate(303.769,-61.1342)">		<title>Rounded Rectangle.126</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<path d="M9.07 536.11 L81.66 536.11 A9.07317 9.07317 -180 0 0 90.73 527.04 L90.73 519.41 A9.07317 9.07317 -180 0 0 81.66					 510.34 L9.07 510.34 A9.07317 9.07317 -180 0 0 -0 519.41 L0 527.04 A9.07317 9.07317 -180 0 0 9.07 536.11					 Z" class="st27"></path>	</g>	<g id="shape66-150" v:mid="66" v:groupcontext="shape" transform="translate(318.954,-66.6634)">		<title>工作表.66</title>		<desc>Gyroscope</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="34.0223" cy="529.154" width="68.05" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="68.05" height="13.92" class="st4"></rect>		<text x="4.02" y="532.4" class="st29" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>陀螺仪传感器</text>		</g>	<g id="shape67-153" v:mid="67" v:groupcontext="shape" transform="translate(406.473,-61.8591)">		<title>Rounded Rectangle.128</title>		<desc>Magnetometer</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45.3649" cy="523.59" width="90.74" height="25.0506"></v:textrect>		<path d="M9.07 536.11 L81.66 536.11 A9.07317 9.07317 -180 0 0 90.73 527.04 L90.73 520.14 A9.07317 9.07317 -180 0 0 81.66					 511.06 L9.07 511.06 A9.07317 9.07317 -180 0 0 0 520.14 L0 527.04 A9.07317 9.07317 -180 0 0 9.07 536.11 Z" class="st27"></path>		<text x="20.36" y="526.84" class="st28" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>地磁传感器</text>		</g>	<g id="shape68-156" v:mid="68" v:groupcontext="shape" transform="translate(612.513,-61.8591)">		<title>Rounded Rectangle.130</title>		<desc>Other Sensors</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45.3649" cy="523.59" width="90.74" height="25.0506"></v:textrect>		<path d="M9.07 536.11 L81.66 536.11 A9.07317 9.07317 -180 0 0 90.73 527.04 L90.73 520.14 A9.07317 9.07317 -180 0 0 81.66					 511.06 L9.07 511.06 A9.07317 9.07317 -180 0 0 0 520.14 L0 527.04 A9.07317 9.07317 -180 0 0 9.07 536.11 Z" class="st27"></path>		<text x="20.36" y="526.84" class="st28" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>其他传感器</text>		</g>	<g id="shape69-159" v:mid="69" v:groupcontext="shape" transform="translate(242.335,-86.6681)">		<title>工作表.69</title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67 L6.3 529.67					 Z" class="st16"></path>	</g>	<g id="shape70-161" v:mid="70" v:groupcontext="shape" transform="translate(345.67,-86.6681)">		<title>工作表.70</title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67 L6.3 529.67					 Z" class="st16"></path>	</g>	<g id="shape71-163" v:mid="71" v:groupcontext="shape" transform="translate(448.374,-86.6681)">		<title>工作表.71</title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67 L6.3 529.67					 Z" class="st16"></path>	</g>	<g id="shape72-165" v:mid="72" v:groupcontext="shape" transform="translate(551.709,-86.6681)">		<title>工作表.72</title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67 L6.3 529.67					 Z" class="st16"></path>	</g>	<g id="shape73-167" v:mid="73" v:groupcontext="shape" transform="translate(654.414,-86.6681)">		<title>工作表.73</title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67 L6.3 529.67					 Z" class="st16"></path>	</g>	<g id="shape74-169" v:mid="74" v:groupcontext="shape" transform="translate(187.832,-105.597)">		<title>工作表.74</title>		<rect x="0" y="253.233" width="528.65" height="282.88" class="st17"></rect>	</g>	<g id="shape75-171" v:mid="75" v:groupcontext="shape" transform="translate(327.712,-129.439)">		<title>工作表.75</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.26 512.91 C49.34 512.91 51.04 514.65 51.04 516.78 L51.04 532.25					 C51.04 534.38 49.34 536.11 47.26 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st2"></path>	</g>	<g id="shape76-173" v:mid="76" v:groupcontext="shape" transform="translate(327.712,-129.439)">		<title>工作表.76</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.26 512.91 C49.34 512.91 51.04 514.65 51.04 516.78 L51.04 532.25					 C51.04 534.38 49.34 536.11 47.26 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st7"></path>	</g>	<g id="shape77-175" v:mid="77" v:groupcontext="shape" transform="translate(344.474,-132.628)">		<title>工作表.77</title>		<desc>I3C</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="12.1508" cy="529.154" width="24.31" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="24.3" height="13.92" class="st4"></rect>		<text x="3.13" y="532.63" class="st30" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>I3C</text>		</g>	<g id="shape78-178" v:mid="78" v:groupcontext="shape" transform="translate(393.241,-129.439)">		<title>工作表.78</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.89 512.91 C49.97 512.91 51.67 514.65 51.67 516.78 L51.67 532.25					 C51.67 534.38 49.97 536.11 47.89 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st2"></path>	</g>	<g id="shape79-180" v:mid="79" v:groupcontext="shape" transform="translate(393.241,-129.439)">		<title>工作表.79</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.89 512.91 C49.97 512.91 51.67 514.65 51.67 516.78 L51.67 532.25					 C51.67 534.38 49.97 536.11 47.89 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st7"></path>	</g>	<g id="shape80-182" v:mid="80" v:groupcontext="shape" transform="translate(410.355,-132.628)">		<title>工作表.80</title>		<desc>SPI</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="12.522" cy="529.154" width="25.05" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="25.05" height="13.92" class="st4"></rect>		<text x="3.17" y="532.63" class="st30" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SPI</text>		</g>	<g id="shape81-185" v:mid="81" v:groupcontext="shape" transform="translate(459.4,-129.439)">		<title>工作表.81</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.26 512.91 C49.34 512.91 51.04 514.65 51.04 516.78 L51.04 532.25					 C51.04 534.38 49.34 536.11 47.26 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st2"></path>	</g>	<g id="shape82-187" v:mid="82" v:groupcontext="shape" transform="translate(459.4,-129.439)">		<title>工作表.82</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.26 512.91 C49.34 512.91 51.04 514.65 51.04 516.78 L51.04 532.25					 C51.04 534.38 49.34 536.11 47.26 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st7"></path>	</g>	<g id="shape83-189" v:mid="83" v:groupcontext="shape" transform="translate(476.232,-132.628)">		<title>工作表.83</title>		<desc>I2C</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="12.1508" cy="529.154" width="24.31" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="24.3" height="13.92" class="st4"></rect>		<text x="3.13" y="532.63" class="st30" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>I2C</text>		</g>	<g id="shape84-192" v:mid="84" v:groupcontext="shape" transform="translate(524.93,-129.439)">		<title>工作表.84</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.26 512.91 C49.34 512.91 51.04 514.65 51.04 516.78 L51.04 532.25					 C51.04 534.38 49.34 536.11 47.26 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st2"></path>	</g>	<g id="shape85-194" v:mid="85" v:groupcontext="shape" transform="translate(524.93,-129.439)">		<title>工作表.85</title>		<path d="M0 516.78 C0 514.65 1.69 512.91 3.78 512.91 L47.26 512.91 C49.34 512.91 51.04 514.65 51.04 516.78 L51.04 532.25					 C51.04 534.38 49.34 536.11 47.26 536.11 L3.78 536.11 C1.69 536.11 0 534.38 0 532.25 L0 516.78 Z" class="st7"></path>	</g>	<g id="shape86-196" v:mid="86" v:groupcontext="shape" transform="translate(535.138,-132.628)">		<title>工作表.86</title>		<desc>UART</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="19.9275" cy="529.154" width="39.86" height="13.9225"></v:textrect>		<rect x="0" y="522.193" width="39.86" height="13.92" class="st4"></rect>		<text x="4.14" y="532.63" class="st30" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>UART</text>		</g>	<g id="shape87-199" v:mid="87" v:groupcontext="shape" transform="translate(508.501,-62.0514)">		<title>Rounded Rectangle.129</title>		<desc>ALS/Prox</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45.3649" cy="523.59" width="90.74" height="25.0506"></v:textrect>		<path d="M9.07 536.11 L81.66 536.11 A9.07317 9.07317 -180 0 0 90.73 527.04 L90.73 520.14 A9.07317 9.07317 -180 0 0 81.66					 511.06 L9.07 511.06 A9.07317 9.07317 -180 0 0 -0 520.14 L0 527.04 A9.07317 9.07317 -180 0 0 9.07 536.11					 Z" class="st31"></path>		<text x="4.81" y="520.34" class="st28" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>光敏传感器<tspan class="st14"> </tspan><tspan class="st14">(</tspan><tspan class="st14">ALS</tspan><tspan class="st14">)/</tspan><tspan x="5.36" dy="1.3em" class="st15">接近传感器</tspan><tspan class="st14"> </tspan><tspan class="st14">(</tspan><tspan class="st14">Prox</tspan><tspan class="st14">)</tspan></text>		</g>	<g id="shape88-211" v:mid="88" v:groupcontext="shape" transform="translate(237.377,-6.404)">		<title>Round Corner Rectangle</title>		<desc>Third-party</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.3733" cy="524.517" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67483 9.67483 -180 0 0 96.75 526.44 L96.75 522.59 A9.67483 9.67483 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67483 9.67483 -180 0 0 -0 522.59 L0 526.44 A9.67483 9.67483 -180 0 0 9.68 536.11					 Z" class="st32"></path>		<text x="30.37" y="528.42" class="st33" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>第三方</text>		</g>	<g id="shape89-214" v:mid="89" v:groupcontext="shape" transform="translate(361.127,-6.404)">		<title>Round Corner Rectangle.114</title>		<desc>Upstream</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.3733" cy="524.517" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67483 9.67483 -180 0 0 96.75 526.44 L96.75 522.59 A9.67483 9.67483 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67483 9.67483 -180 0 0 -0 522.59 L0 526.44 A9.67483 9.67483 -180 0 0 9.68 536.11					 Z" class="st34"></path>		<text x="36.37" y="528.42" class="st33" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>上游</text>		</g>	<g id="shape90-217" v:mid="90" v:groupcontext="shape" transform="translate(484.876,-6.404)">		<title>Round Corner Rectangle.116</title>		<desc>Qualcomm</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.3733" cy="524.517" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67483 9.67483 -180 0 0 96.75 526.44 L96.75 522.59 A9.67483 9.67483 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67483 9.67483 -180 0 0 -0 522.59 L0 526.44 A9.67483 9.67483 -180 0 0 9.68 536.11					 Z" class="st35"></path>		<text x="19.37" y="528.12" class="st36" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Qualcomm</text>		</g>	<g id="shape91-220" v:mid="91" v:groupcontext="shape" transform="translate(608.626,-6.404)">		<title>Round Corner Rectangle.118</title>		<desc>Hardware</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.3733" cy="524.517" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67483 9.67483 -180 0 0 96.75 526.44 L96.75 522.59 A9.67483 9.67483 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67483 9.67483 -180 0 0 -0 522.59 L0 526.44 A9.67483 9.67483 -180 0 0 9.68 536.11					 Z" class="st37"></path>		<text x="36.37" y="528.42" class="st38" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>硬件</text>		</g></g>
</svg>

QSH 架构组件

- **应用处理器软件模块**

    - **客户端应用程序**：其包含与应用处理器端的 QSH 客户端 API 交互的*应用程序 main()* 或*入口函数*。
    - **QSH 客户端 API**：它提供 high-level API 来访问 QSH 提供的服务。它通过抽象系统复杂性并专注于应用程序逻辑来简化应用程序开发。更多信息，参见[接口](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-7/qsh_api_reference.html)。
- **低功耗处理器软件模块**

    - **客户端管理器**：客户端管理器负责低功耗处理器与应用处理器的所有通信。负责执行以下操作：

表：客户端管理器功能

        | 功能 | 说明 |
        | --- | --- |
        | 转换传入请求 | 客户端管理器接受传入的请求，并将其转换为 QSH 可以理解的格式。 |
        | 转换传出指示 | 客户端管理器从 QSH 接收事件消息，并将这些事件消息转换为 QSH 外部可理解的格式的传出指示。 |
        | 保证批处理选项 | 如果客户端指定了某些批处理（本地存储/累积）选项，则客户端管理器将确保满足批处理选项。符合标准意味着客户端管理器会检查数据是否按照客户指定的方式进行分组和发送。 |
    - **服务管理器**：QSH 通过其服务管理器提供同步服务。传感器和传感器实例 API 使用回调连接到此服务管理器。

        `adsp_proc/qsh_platform/inc/sns_service.h` 文件列出了 QSH 中可用的服务，也称为 QSH 服务。下表介绍了对设备驱动程序至关重要的关键 QSH 服务。

表：QSH 服务

        | QSH 服务 | 说明 |
        | --- | --- |
        | 流服务 | <ul class="simple"><br><li><p>允许使用传感器创建和删除数据流。</p></li><br><li><p>有关通过数据流发送请求和接收事件的流 API，参见 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/sns_data_stream.h</span></code> 文件。</p></li><br></ul> |
        | 属性服务 | <ul class="simple"><br><li><p>允许传感器发布传感器属性或功能。</p></li><br><li><p>所有标准属性 ID 和预期值类型均在 <code class="docutils literal notranslate"><span class="pre">sns_std_sensor.proto</span></code> 文件中定义。</p></li><br><li><p>所有属性值必须采用 nanopb 编码格式。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_attribute_service.h</span></code> 文件。</p></li><br></ul> |
        | 诊断服务 | <ul class="simple"><br><li><p>提供调试消息和数据日志数据包服务，并定义标准日志数据包 ID。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_diag_service.h</span></code> 文件。</p></li><br></ul> |
        | 事件服务 | <ul class="simple"><br><li><p>允许从源传感器实例发布输出事件。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_event_service.h</span></code> 文件。</p></li><br></ul> |
        | 电源服务 | <ul class="simple"><br><li><p>可供物理传感器注册和投票供电域（开/关）。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_pwr_rail_service.h</span></code> 文件。</p></li><br></ul> |
        | 同步 COM 端口 (SCP) 服务 | <ul class="simple"><br><li><p>可供物理传感器注册/注销 COM 端口以及通过 COM 端口执行同步传输。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_sync_com_port_service.h</span></code> 文件。</p></li><br></ul> |
        | GPIO 服务 | <ul class="simple"><br><li><p>可供物理传感器读/写 GPIO 值。</p></li><br><li><p>有效抽象了一个 low-level CoreBSP 层来控制 GPIO。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_gpio_service.h</span></code> 文件。</p></li><br></ul> |
        | Island 服务 | <ul class="simple"><br><li><p>可供物理传感器请求 Island 出口。</p></li><br><li><p>当应用程序必须访问 DDR 或非 Island 资源时，应用程序代码可以使用 Island 服务。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_island_service.h</span></code> 文件。</p></li><br></ul> |
        | 文件系统服务 | <ul class="simple"><br><li><p>可供物理传感器使用，用于文件服务管理。</p></li><br><li><p>抽象文件系统是应用处理器堆栈的一部分，可用于从低功耗处理器进行本地访问。</p></li><br><li><p>关于 API 的更多信息，请参阅 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/inc/services/sns_file_service.h</span></code> 文件。</p></li><br></ul> |
    - **平台传感器**：QSH 提供一些内置传感器，用于平台或硬件特定的抽象，这些抽象可由其他传感器和传感器实例使用。下表介绍了平台传感器：

表：平台传感器

        | 平台传感器 | 说明 |
        | --- | --- |
        | 注册表传感器 | <ul class="simple"><br><li><p>QSH 中的注册表传感器为传感器提供了一个接口，用于从持久内存访问注册表数据。它允许传感器创建数据流、发送请求、接收数据事件、订阅更新以及删除不必要的流。</p></li><br><li><p>有关注册表传感器的详细信息，参见 <a href="https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/configuration_customization.html" rel="noopener noreferrer" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/configuration_customization.html')">Qualcomm Linux Sensors Guide - Addendum</a> 中的 <a href="https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/overview.html" rel="noopener noreferrer" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/overview.html')">Configure</a>。</p></li><br></ul><br><br><br>> <br>> <br>> Note<br>> <br>> <br>> [Qualcomm Linux Sensors Guide - Addendum](https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/overview.html) 适用于具有授权访问权限的许可开发人员。<br><br><ul class="simple"><br><li><p>注册表传感器 API 记录在 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_api/pb/sns_registry.proto</span></code> 文件中。</p></li><br></ul> |
        | 定时器传感器 | <ul class="simple"><br><li><p>QSH 中的定时器传感器提供了一个接口用于启动周期性或一次性定时器。需要计时器的传感器必须创建数据流、发送请求并读取传递的数据事件。</p></li><br><li><p>计时器传感器 API 记录在 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/api/public_sns/sns_timer.proto</span></code> 文件中。</p></li><br></ul> |
        | 中断传感器 | <ul class="simple"><br><li><p>QSH 中的中断传感器提供用于注册中断的接口。需要中断的传感器必须创建一个数据流、发送请求并读取传递的数据事件。</p></li><br><li><p>中断传感器 API 记录在 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/api/public_sns/sns_interrupt.proto</span></code> 文件中。</p></li><br></ul> |
        | 异步 COM 端口 (ASCP) 传感器 | <ul class="simple"><br><li><p>QSH 中的 ASCP 传感器为通过通信端口进行异步读/写操作提供了一个接口。</p></li><br><li><p>需要此功能的传感器必须创建数据流、发送请求并读取传递的数据事件。</p></li><br><li><p>ASCP 传感器 API 记录在 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/api/public_sns/sns_async_com_port.proto</span></code> 文件中。</p></li><br></ul><br><br><br>> <br>> <br>> Note<br>> <br>> <br>> 物理传感器驱动程序通常使用 ASCP 传感器读取大块 FIFO。 |
        | SUID 查询传感器 | <ul class="simple"><br><li><p>QSH 中的 SUID 查找传感器提供了一个 API，用于获取相关传感器的 SUID。它自己的 SUID 可通过 <code class="docutils literal notranslate"><span class="pre">sns_sensor_util.h</span></code> 文件中的 <code class="docutils literal notranslate"><span class="pre">sns_get_suid_lookup()</span></code> 函数使用。</p></li><br><li><p>SUID 查找传感器 API 记录在 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_api/pb/sns_suid.proto</span></code> 文件中。</p></li><br></ul> |
        | 测试传感器 | <ul class="simple"><br><li><p>测试传感器用于自定义及运行特定于传感器的用例。</p></li><br><li><p>测试传感器位于 <code class="docutils literal notranslate"><span class="pre">adsp_proc/qsh_platform/sensors/test</span></code> 目录中。</p></li><br></ul> |
    - **QSH 实用工具**：QSH 为传感器和传感器实例提供了多个帮助程序实用工具。所有实用工具均可以在 `adsp_proc/qsh_platform/inc/utils` 目录中找到。下表介绍了关键工具：

表：QSH 实用工具

        | QSH 实用工具 | 说明 |
        | --- | --- |
        | Nanopb 编码/解码 | <ul class="simple"><br><li><p>为所有传感器提供通用的编码/解码辅助函数。例如，编码/解码 <code class="docutils literal notranslate"><span class="pre">sns_request</span></code> 消息、编码和发布/解码数据事件。</p></li><br><li><p>异步 COM 端口 nanopb 实用工具可用于物理传感器驱动程序。</p></li><br></ul> |
        | 传感器实用工具 | <ul class="simple"><br><li><p>提供常见功能，例如查找传感器实例和获取 SUID 查找传感器的 SUID。</p></li><br></ul> |
        | 属性实用工具 | <ul class="simple"><br><li><p>提供可编码并发布传感器属性的辅助函数。</p></li><br></ul> |
        | 内存工具 | <ul class="simple"><br><li><p>提供用于高效内存管理和分配的辅助函数。</p></li><br></ul> |
        | 数学运算工具 | <ul class="simple"><br><li><p>提供数学函数和运算的集合，例如矩阵、FFT 和 IIR 滤波器。</p></li><br></ul> |
        | Printf 工具 | <ul class="simple"><br><li><p>包含用于格式化和打印数据的辅助函数。</p></li><br></ul> |

## 传感器和传感器实例

QSH 传感器实现分为两个逻辑单元：传感器和传感器实例。

- 传感器是异步数据的生成者或使用者或二者的组合。
- 每个传感器可以有一个或多个传感器实例。
- 任何传感器数据请求都将创建一个传感器实例或共享一个现有传感器实例。
- 传感器实例根据传感器确定的结果按需创建。

    - 传感器完全管理其相应实例的生命周期和配置，并负责向其客户端发送配置更新和初始状态事件。
    - 每个传感器实例均使用特定的客户端配置运行。
    - 物理传感器的传感器实例对传感器硬件进行编程，使其以所需的配置运行。
    - 供应商必须以最少数量的传感器实例处理所有客户端请求。
    - 由传感器实例生成的数据流会发送至所有活动客户端。
- 多个传感器可以共享和配置一个传感器实例，此操作模式通常用于硬件传感器的组合驱动程序，例如：

    - 加速度计和陀螺仪
    - 接近度和环境光

## 传感器间通信

QSH 框架中的每个算法和传感器驱动程序均是指具有标准 QSH API 的传感器。在任何实际用例中，这些传感器之间的信息交换都是必要的。

所有传感器之间的通信，包括发送和接收，都是通过数据流上的请求和事件消息进行的。消息净荷使用 nanopb 生成器、编码器和解码器以协议缓存格式定义。消息净荷长度、消息 ID 和时间戳（事件）在由 QSH 框架管理的元数据内进行通信。

下图展示了数据客户端和数据源之间使用数据流的通信：

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- 由 Microsoft Visio, SVG Export 生成 sensors_Comunication.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="7.61675in" height="2.57204in" viewbox="0 0 548.406 185.187" xml:space="preserve" color-interpolation-filters="sRGB" class="st14"><v:documentproperties v:langid="2052">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>		<v:ud v:nameu="msvWarnOnPersonalInfo" v:val="VT0(0):5"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-2 .st1 { fill: #f7f8fa; stroke: none; stroke-width: 0.25 }
.svg-2 .st2 { fill: #ffffff; stroke: #000000; stroke-width: 2 }
.svg-2 .st3 { fill: #ffffff; stroke: #000000; stroke-width: 0.999999 }
.svg-2 .st4 { fill: #4a5a75; stroke: none; stroke-width: 2 }
.svg-2 .st5 { fill: #f7f8fa; font-family: Arial; font-size: 1.00001em }
.svg-2 .st6 { font-family: SimHei; font-size: 1em }
.svg-2 .st7 { fill: #ffffff; stroke: none; stroke-width: 0.25 }
.svg-2 .st8 { fill: #000000; font-family: SimHei; font-size: 1.00001em }
.svg-2 .st9 { font-size: 1em }
.svg-2 .st10 { marker-end: url("#mrkr5-42"); marker-start: url("#mrkr5-40"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999999 }
.svg-2 .st11 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409077729982 }
.svg-2 .st12 { fill: #4a5a75; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-2 .st13 { fill: #feffff; font-family: SimHei; font-size: 1.00001em }
.svg-2 .st14 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend5">		<path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"></path>	</g>	<marker id="mrkr5-40" class="st11" v:arrowtype="5" v:arrowsize="2" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(3.5200016329451) "></use>	</marker>	<marker id="mrkr5-42" class="st11" v:arrowtype="5" v:arrowsize="2" v:setback="0" refx="-0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(-3.5200016329451,-3.5200016329451) "></use>	</marker></defs><g v:mid="1" v:index="1" v:groupcontext="backgroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>		<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>VBackground-1</title>	<v:pageproperties width="7.61675" height="2.57204" v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="8.99999" v:shadowoffsety="-8.99999"></v:pageproperties>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(0.000177682,0)">		<title>Solid</title>		<v:userdefs>			<v:ud v:nameu="Background" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="msvShapeCategories" v:prompt="" v:val="VT4(DoNotContain)"></v:ud>			<v:ud v:nameu="msvVisioCreated" v:prompt="" v:val="VT0(0):26"></v:ud>		</v:userdefs>		<rect x="0" y="0" width="548.406" height="185.187" class="st1"></rect>	</g></g><g v:mid="0" v:index="2" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="8.99999" v:shadowoffsety="-8.99999"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1-3" v:mid="1" v:groupcontext="shape" transform="translate(19.9999,-41.4882)">		<title>Rounded Rectangle.2</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<path d="M19.78 185.19 L107.16 185.19 A19.7817 19.7817 -180 0 0 126.94 165.4 L126.94 122.71 A19.7817 19.7817 -180 0 0					 107.16 102.93 L19.78 102.93 A19.7817 19.7817 -180 0 0 0 122.71 L0 165.4 A19.7817 19.7817 -180 0 0 19.78					 185.19 Z" class="st2"></path>	</g>	<g id="shape2-5" v:mid="2" v:groupcontext="shape" transform="translate(385.688,-41.4918)">		<title>Rounded Rectangle.3</title>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<path d="M22.24 185.19 L120.48 185.19 A22.2399 22.2399 -180 0 0 142.72 162.95 L142.72 125.17 A22.2399 22.2399 -180 0					 0 120.48 102.93 L22.24 102.93 A22.2399 22.2399 -180 0 0 0 125.17 L0 162.95 A22.2399 22.2399 -180 0 0 22.24					 185.19 Z" class="st2"></path>	</g>	<g id="shape3-7" v:mid="3" v:groupcontext="shape" transform="translate(146.943,-44.4669)">		<title>Simple Arrow.30</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="ArrowType" v:prompt="" v:val="VT0(2):26"></v:ud>		</v:userdefs>		<path d="M0 165.59 L13.97 145.98 L13.97 155.78 L238.08 155.78 L238.08 165.59 L238.08 175.39 L13.97 175.39 L13.97 185.19					 L0 165.59 Z" class="st3"></path>	</g>	<g id="shape4-9" v:mid="4" v:groupcontext="shape" transform="translate(384.235,251.471) rotate(180)">		<title>Simple Arrow.29</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="ArrowType" v:prompt="" v:val="VT0(2):26"></v:ud>		</v:userdefs>		<path d="M0 166.67 L12 148.14 L12 157.4 L236.82 157.4 L236.82 166.67 L236.82 175.93 L12 175.93 L12 185.19 L0 166.67 Z" class="st3"></path>	</g>	<g id="shape5-11" v:mid="5" v:groupcontext="shape" transform="translate(84.5334,-52.9398)">		<title>Rounded Rectangle.22</title>		<desc>PB Encode/Decode</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.4398" cy="155.502" width="56.89" height="59.364"></v:textrect>		<path d="M11.43 185.19 L45.45 185.19 A11.428 11.428 -180 0 0 56.88 173.76 L56.88 137.25 A11.428 11.428 -180 0 0 45.45					 125.82 L11.43 125.82 A11.428 11.428 -180 0 0 -0 137.25 L0 173.76 A11.428 11.428 -180 0 0 11.43 185.19 Z" class="st4"></path>		<text x="5.1" y="151.6" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>PB <tspan class="st6">编码</tspan>/<tspan x="16.44" dy="1.3em" class="st6">解码</tspan></text>		</g>	<g id="shape6-16" v:mid="6" v:groupcontext="shape" transform="translate(391.21,-52.9398)">		<title>Rounded Rectangle.21</title>		<desc>PB Encode/Decode</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(1):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="32.3854" cy="155.502" width="64.78" height="59.364"></v:textrect>		<path d="M15.27 185.19 L49.5 185.19 A15.2663 15.2663 -180 0 0 64.77 169.92 L64.77 141.09 A15.2663 15.2663 -180 0 0 49.5					 125.82 L15.27 125.82 A15.2663 15.2663 -180 0 0 -0 141.09 L0 169.92 A15.2663 15.2663 -180 0 0 15.27 185.19					 Z" class="st4"></path>		<text x="9.05" y="151.6" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>PB <tspan class="st6">编码</tspan>/<tspan x="20.39" dy="1.3em" class="st6">解码</tspan></text>		</g>	<g id="shape7-21" v:mid="7" v:groupcontext="shape" transform="translate(231.406,-97.2695)">		<title>工作表.7</title>		<desc>Request</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.4398" cy="181.227" width="56.88" height="7.91999"></v:textrect>		<rect x="0" y="177.267" width="56.88" height="7.91999" class="st7"></rect>		<text x="16.44" y="185.13" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>请求</text>		</g>	<g id="shape8-24" v:mid="8" v:groupcontext="shape" transform="translate(231.406,-60.0156)">		<title>工作表.8</title>		<desc>Event</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.4398" cy="179.937" width="56.88" height="10.5"></v:textrect>		<rect x="0" y="174.687" width="56.88" height="10.5" class="st7"></rect>		<text x="16.44" y="183.84" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>事件</text>		</g>	<g id="shape9-27" v:mid="9" v:groupcontext="shape" transform="translate(24.1563,-67.7496)">		<title>工作表.9</title>		<desc>Data Client</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.4398" cy="168.987" width="56.89" height="32.4"></v:textrect>		<rect x="0" y="152.787" width="56.88" height="32.4" class="st7"></rect>		<text x="16.44" y="165.09" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>数据<v:lf></v:lf><tspan x="10.44" dy="1.3em" class="st9">客户端</tspan></text>		</g>	<g id="shape10-31" v:mid="10" v:groupcontext="shape" transform="translate(465.156,-66.4248)">		<title>工作表.10</title>		<desc>Data Source</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.4398" cy="168.987" width="56.89" height="32.4"></v:textrect>		<rect x="0" y="152.787" width="56.88" height="32.4" class="st7"></rect>		<text x="10.44" y="172.89" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>数据源</text>		</g>	<g id="shape11-34" v:mid="11" v:groupcontext="shape" v:layermember="0" transform="translate(83.4714,-123.75)">		<title>Dynamic connector.27</title>		<path d="M0 185.19 L0 179.39 L0 179.03 L0 171.69 L373.58 171.69 L373.58 179.02 L373.58 185.18" class="st10"></path>	</g>	<g id="shape12-43" v:mid="12" v:groupcontext="shape" transform="translate(219.839,-149.225)">		<title>工作表.12</title>		<desc>Data Stream</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="40.0066" cy="176.331" width="80.02" height="17.712"></v:textrect>		<rect x="0" y="167.475" width="80.0135" height="17.712" class="st7"></rect>		<text x="22.01" y="180.23" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>数据流</text>		</g>	<g id="shape13-46" v:mid="13" v:groupcontext="shape" transform="translate(371.642,-18.247)">		<title>Round Corner Rectangle</title>		<desc>Third-party</desc>		<v:userdefs>			<v:ud v:nameu="CTypeTopLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeTopRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotLeftSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CTypeBotRightSnip" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockHoriz" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockVert" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="CornerLockDiag" v:prompt="" v:val="VT0(0):5"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0):26"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="40.0066" cy="176.328" width="80.02" height="17.712"></v:textrect>		<path d="M8 185.19 L72.01 185.19 A8.00122 8.00122 -180 0 0 80.01 177.19 L80.01 175.48 A8.00122 8.00122 -180 0 0 72.01					 167.47 L8 167.47 A8.00122 8.00122 -180 0 0 0 175.48 L0 177.19 A8.00122 8.00122 -180 0 0 8 185.19 Z" class="st12"></path>		<text x="22.01" y="180.32" class="st13" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>第三方</text>		</g></g>
</svg>

客户端与源之间的传感器通信

- 发送的请求消息用于启用、禁用和重新配置传感器。请求消息始终可寻址到特定的 SUID。当目标传感器接收到请求消息后，就会将其发送至传感器实例进行适当处理。
- 传感器实例将事件消息异步发送到其注册的客户端，这些客户端可能是其他传感器或传感器实例。

## QSH 中的 Nanopb 协议缓存

QSH 将 nanopb 协议缓存应用于：

- 传感器之间交换的所有请求和事件消息。

    - 传感器或传感器实例必须针对其发送至从属传感器或传感器实例的所有请求的净荷（如果存在）进行编码。
    - 传感器或传感器实例必须针对其接收的所有请求的净荷（如果存在）进行解码。
    - 传感器或传感器实例必须针对其发布的所有事件的净荷（如果存在）进行编码。
    - 传感器或传感器实例必须针对从其从属传感器或传感器实例接收的所有事件的净荷（如果存在）进行解码。

> 
> 
> Note
> 
> 
> 某些请求或事件不含消息主体。在这种情况下，不需要对净荷进行解码或编码，传感器会根据消息 ID 来处理这些消息。
- 表示属性数据

    - 所有属性值均采用 nanopb 编码格式。
- 诊断日志数据包净荷

    - 诊断日志数据包中的所有净荷均采用 nanopb 编码格式。

Note

有关 Google 协议缓存和 nanopb 的更多信息，参见[协议缓存](https://developers.google.com/protocol-buffers/)和 [nanopb](https://jpa.kapsi.fi/nanopb/)。

## 传感器 API 消息

以下文件引用 API 消息（其中包含消息定义），用于传感器之间的通信：

- `.proto` 文件包含协议缓存消息定义和文档，用于在传感器之间进行通信。
- 下表列出了 `<workspace>/build-qcom-wayland/workspace/sources/sensinghub/sensing-hub/apis/proto/sns_std_*.proto` 文件中定义的 API 标准消息：

表：标准原型文件

    | 文件 | 说明 |
    | --- | --- |
    | `sns_std.proto` | 此文件包含标准定义，例如：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>消息 ID</p></li><br>> <li><p>请求消息</p></li><br>> <li><p>批处理规范</p></li><br>> <li><p>属性请求和事件</p></li><br>> <li><p>错误事件</p></li><br>> </ul> |
    | `sns_std_sensor.proto` | 此文件包含定义，例如：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>请求的消息 ID 以及标准传感器的事件 API</p></li><br>> <li><p>流传输和事件消息</p></li><br>> <li><p>传感器样本状态类型</p></li><br>> <li><p>标准属性 ID</p></li><br>> <li><p>通用属性类型</p></li><br>> <li><p>物理传感器配置事件消息</p></li><br>> </ul> |
    | `sns_std_type.proto` | 此文件包含常见的 API 类型定义，例如：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>SUID 消息</p></li><br>> <li><p>属性事件和值消息</p></li><br>> <li><p>通用错误类型</p></li><br>> </ul> |
    | `sns_std_event_gated_sensor.proto` | 此文件包括事件门控传感器的 API，包括配置消息 ID 和 API 文档。 |
- 特定于物理传感器的 API 定义和文档位于传感器特定的 `.proto` 文件中。例如，`sns_accel.proto`，`sns_proximity.proto` 和 `sns_motion_detect.proto`。
- 平台传感器 API 定义和文档位于 `adsp_proc/qsh_platform/api/` 目录中。例如，`sns_timer.proto`，`sns_interrupt.proto` 和 `sns_async_com_port.proto`。
- SUID、注册表和诊断的框架相关 API 在以下 proto 文件中定义：

    - `sns_suid.proto`
    - `sns_registry.proto`
    - `sns_diag.proto`

Last Published: Jan 23, 2025

[Previous Topic
功能](https://docs.qualcomm.com/bundle/publicresource/80-70017-7SC/topics/supported_features.md) [Next Topic
接口](https://docs.qualcomm.com/bundle/publicresource/80-70017-7SC/topics/qsh_api_reference.md)