# Architecture

Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html)

Note: Source code of the low-power
            processor (aDSP), including the QSH framework is available only for the Authorized
            users. To upgrade your access, go to: [www.qualcomm.com/support/working-with-qualcomm](https://www.qualcomm.com/support/working-with-qualcomm).

Note: To continue reading about the
                APIs and/or set up sensor information, skip directly to [Interfaces](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-7/qsh_api_reference.html).

The QSH synonymous with the Qualcomm® Snapdragon™ sensors core
            (SSC), offers a unified event-driven framework for drivers and algorithms.
        The QSH supports the same set of APIs for both the hardware-based and software-based
            sensors. Additionally, the QSH supports asynchronous bus transfer and is easily
            extendable for new or custom driver features. The QSH consists of various components
            that include the QSH client APIs, sensor APIs, a core framework, pre-implemented
            platform sensors, vendor-implemented sensors, and the test modules. It serves external
            clients and provides a simple interface to access the sensor data.

Figure : QSH architecture
                
                <?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">
<!-- Generated by Microsoft Visio, SVG Export qsh-architecture.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.477 536.113" xml:space="preserve" color-interpolation-filters="sRGB" class="st29"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<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 { 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 { fill: #3253dc; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.916033 }
.svg-1 .st7 { fill: #f7f8fa; font-family: Arial; font-size: 0.966591em }
.svg-1 .st8 { fill: #4a5a75; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st9 { fill: #f7f8fa; font-family: Arial; font-size: 1.23507em }
.svg-1 .st10 { fill: #39a3b5; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st11 { fill: #0b2742; font-family: Arial; font-size: 1.23507em; font-weight: bold }
.svg-1 .st12 { fill: #13161e; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.0398275 }
.svg-1 .st13 { stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st14 { fill: #4a5a75; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.916033 }
.svg-1 .st15 { fill: #f7f8fa; font-family: Arial; font-size: 0.96666em }
.svg-1 .st16 { fill: #000000; font-family: Arial; font-size: 1.20767em }
.svg-1 .st17 { fill: #f7f8fa; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st18 { fill: #f7f8fa; stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st19 { stroke: #13161e; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.79655 }
.svg-1 .st20 { fill: #dee3ec; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st21 { fill: #13161e; font-family: Arial; font-size: 1.00001em }
.svg-1 .st22 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-1 .st23 { fill: #dee3ec; stroke: #000000; stroke-width: 2 }
.svg-1 .st24 { fill: #4a5a75; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st25 { fill: #feffff; font-family: Arial; font-size: 1.00001em }
.svg-1 .st26 { fill: #39a3b5; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st27 { fill: #3253dc; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st28 { fill: #dee3ec; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-1 .st29 { 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="shape120-1" v:mid="120" v:groupcontext="shape" transform="translate(9,0)">		<title></title>		<rect x="0" y="-3.88747" width="720" height="540" class="st1"></rect>	</g>	<g id="shape5-3" v:mid="5" v:groupcontext="shape" transform="translate(194.761,-182.921)">		<title></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="shape6-5" v:mid="6" v:groupcontext="shape" transform="translate(194.761,-182.921)">		<title></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="shape7-7" v:mid="7" v:groupcontext="shape" transform="translate(210.586,-333.37)">		<title></title>		<desc>Qualcomm Sensing Hub</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="82.2695" cy="528.378" width="164.54" height="15.4689"></v:textrect>		<path d="M164.54 520.64 L0 520.64 L0 536.11 L164.54 536.11 L164.54 520.64" class="st4"></path>		<text x="7.8" y="532.24" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Qualcomm Sensing Hub</text>		</g>	<g id="shape8-11" v:mid="8" v:groupcontext="shape" transform="translate(507.916,-296.333)">		<title></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="shape9-13" v:mid="9" v:groupcontext="shape" transform="translate(507.916,-296.333)">		<title></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="st6"></path>	</g>	<g id="shape10-15" v:mid="10" v:groupcontext="shape" transform="translate(551.062,-301.883)">		<title></title>		<desc>Client Manager</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="46.9981" cy="529.151" width="94" height="13.9225"></v:textrect>		<path d="M94 522.19 L0 522.19 L0 536.11 L94 536.11 L94 522.19" class="st4"></path>		<text x="7.67" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Client Manager</text>		</g>	<g id="shape12-19" v:mid="12" v:groupcontext="shape" transform="translate(194.761,-473.714)">		<title></title>		<path d="M0 510.9 C-0 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="st8"></path>	</g>	<g id="shape13-21" v:mid="13" v:groupcontext="shape" transform="translate(393.984,-477.489)">		<title></title>		<desc>Client Application</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="68.2578" cy="527.218" width="136.52" height="17.7886"></v:textrect>		<path d="M136.52 518.32 L0 518.32 L0 536.11 L136.52 536.11 L136.52 518.32" class="st4"></path>		<text x="11" y="531.66" class="st9" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Client Application</text>		</g>	<g id="shape15-25" v:mid="15" v:groupcontext="shape" transform="translate(194.761,-419.863)">		<title></title>		<path d="M0 510.9 C-0 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="st10"></path>	</g>	<g id="shape16-27" v:mid="16" v:groupcontext="shape" transform="translate(400.285,-420.454)">		<title></title>		<desc>QSH Client API</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="60.9459" cy="527.218" width="121.9" height="17.7886"></v:textrect>		<path d="M121.89 518.32 L0 518.32 L0 536.11 L121.89 536.11 L121.89 518.32" class="st4"></path>		<text x="9.88" y="531.66" class="st9" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>QSH Client API</text>		</g>	<g id="shape17-31" v:mid="17" v:groupcontext="shape" transform="translate(18.39,-505.726)">		<title></title>		<desc>Application processor</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="83.8782" cy="527.218" width="167.76" height="17.7886"></v:textrect>		<path d="M167.76 518.32 L0 518.32 L0 536.11 L167.76 536.11 L167.76 518.32" class="st4"></path>		<text x="5.64" y="531.66" class="st11" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Application processor</text>		</g>	<g id="shape18-35" v:mid="18" v:groupcontext="shape" transform="translate(22.0089,-364.098)">		<title></title>		<desc>Low power processor</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="83.1375" cy="527.218" width="166.28" height="17.7886"></v:textrect>		<path d="M166.28 518.32 L0 518.32 L0 536.11 L166.28 536.11 L166.28 518.32" class="st4"></path>		<text x="6.55" y="531.66" class="st11" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Low power processor</text>		</g>	<g id="shape19-39" v:mid="19" v:groupcontext="shape" transform="translate(18.0199,-394.671)">		<title></title>		<path d="M0 534.78 L10.51 534.78 L10.51 536.11 L0 536.11 L0 534.78 L0 534.78 ZM14.45 534.78 L24.97 534.78 L24.97 536.11					 L14.45 536.11 L14.45 534.78 L14.45 534.78 ZM28.91 534.78 L39.38 534.78 L39.38 536.11 L28.91 536.11 L28.91					 534.78 L28.91 534.78 ZM43.32 534.78 L53.83 534.78 L53.83 536.11 L43.32 536.11 L43.32 534.78 L43.32 534.78					 ZM57.77 534.78 L68.29 534.78 L68.29 536.11 L57.77 536.11 L57.77 534.78 L57.77 534.78 ZM72.22 534.78 L82.7					 534.78 L82.7 536.11 L72.22 536.11 L72.22 534.78 L72.22 534.78 ZM86.64 534.78 L97.15 534.78 L97.15 536.11					 L86.64 536.11 L86.64 534.78 L86.64 534.78 ZM101.09 534.78 L111.61 534.78 L111.61 536.11 L101.09 536.11 L101.09					 534.78 L101.09 534.78 ZM115.54 534.78 L126.02 534.78 L126.02 536.11 L115.54 536.11 L115.54 534.78 L115.54					 534.78 ZM129.96 534.78 L140.47 534.78 L140.47 536.11 L129.96 536.11 L129.96 534.78 L129.96 534.78 ZM144.41					 534.78 L154.92 534.78 L154.92 536.11 L144.41 536.11 L144.41 534.78 L144.41 534.78 ZM158.86 534.78 L169.34					 534.78 L169.34 536.11 L158.86 536.11 L158.86 534.78 L158.86 534.78 ZM173.28 534.78 L183.79 534.78 L183.79					 536.11 L173.28 536.11 L173.28 534.78 L173.28 534.78 ZM187.73 534.78 L198.24 534.78 L198.24 536.11 L187.73					 536.11 L187.73 534.78 L187.73 534.78 ZM202.18 534.78 L212.66 534.78 L212.66 536.11 L202.18 536.11 L202.18					 534.78 L202.18 534.78 ZM216.59 534.78 L227.11 534.78 L227.11 536.11 L216.59 536.11 L216.59 534.78 L216.59					 534.78 ZM231.05 534.78 L241.56 534.78 L241.56 536.11 L231.05 536.11 L231.05 534.78 L231.05 534.78 ZM245.5					 534.78 L255.97 534.78 L255.97 536.11 L245.5 536.11 L245.5 534.78 L245.5 534.78 ZM259.91 534.78 L270.43 534.78					 L270.43 536.11 L259.91 536.11 L259.91 534.78 L259.91 534.78 ZM274.37 534.78 L284.88 534.78 L284.88 536.11					 L274.37 536.11 L274.37 534.78 L274.37 534.78 ZM288.82 534.78 L299.29 534.78 L299.29 536.11 L288.82 536.11					 L288.82 534.78 L288.82 534.78 ZM303.23 534.78 L313.75 534.78 L313.75 536.11 L303.23 536.11 L303.23 534.78					 L303.23 534.78 ZM317.68 534.78 L328.2 534.78 L328.2 536.11 L317.68 536.11 L317.68 534.78 L317.68 534.78					 ZM332.14 534.78 L342.61 534.78 L342.61 536.11 L332.14 536.11 L332.14 534.78 L332.14 534.78 ZM346.55 534.78					 L357.07 534.78 L357.07 536.11 L346.55 536.11 L346.55 534.78 L346.55 534.78 ZM361 534.78 L371.52 534.78 L371.52					 536.11 L361 536.11 L361 534.78 L361 534.78 ZM375.46 534.78 L385.93 534.78 L385.93 536.11 L375.46 536.11					 L375.46 534.78 L375.46 534.78 ZM389.87 534.78 L400.38 534.78 L400.38 536.11 L389.87 536.11 L389.87 534.78					 L389.87 534.78 ZM404.32 534.78 L414.84 534.78 L414.84 536.11 L404.32 536.11 L404.32 534.78 L404.32 534.78					 ZM418.77 534.78 L429.25 534.78 L429.25 536.11 L418.77 536.11 L418.77 534.78 L418.77 534.78 ZM433.19 534.78					 L443.7 534.78 L443.7 536.11 L433.19 536.11 L433.19 534.78 L433.19 534.78 ZM447.64 534.78 L458.16 534.78					 L458.16 536.11 L447.64 536.11 L447.64 534.78 L447.64 534.78 ZM462.09 534.78 L472.57 534.78 L472.57 536.11					 L462.09 536.11 L462.09 534.78 L462.09 534.78 ZM476.51 534.78 L487.02 534.78 L487.02 536.11 L476.51 536.11					 L476.51 534.78 L476.51 534.78 ZM490.96 534.78 L501.47 534.78 L501.47 536.11 L490.96 536.11 L490.96 534.78					 L490.96 534.78 ZM505.41 534.78 L515.89 534.78 L515.89 536.11 L505.41 536.11 L505.41 534.78 L505.41 534.78					 ZM519.83 534.78 L530.34 534.78 L530.34 536.11 L519.83 536.11 L519.83 534.78 L519.83 534.78 ZM534.28 534.78					 L544.79 534.78 L544.79 536.11 L534.28 536.11 L534.28 534.78 L534.28 534.78 ZM548.73 534.78 L559.21 534.78					 L559.21 536.11 L548.73 536.11 L548.73 534.78 L548.73 534.78 ZM563.14 534.78 L573.66 534.78 L573.66 536.11					 L563.14 536.11 L563.14 534.78 L563.14 534.78 ZM577.6 534.78 L588.11 534.78 L588.11 536.11 L577.6 536.11					 L577.6 534.78 L577.6 534.78 ZM592.05 534.78 L602.53 534.78 L602.53 536.11 L592.05 536.11 L592.05 534.78					 L592.05 534.78 ZM606.46 534.78 L616.98 534.78 L616.98 536.11 L606.46 536.11 L606.46 534.78 L606.46 534.78					 ZM620.92 534.78 L631.43 534.78 L631.43 536.11 L620.92 536.11 L620.92 534.78 L620.92 534.78 ZM635.37 534.78					 L645.84 534.78 L645.84 536.11 L635.37 536.11 L635.37 534.78 L635.37 534.78 ZM649.78 534.78 L660.3 534.78					 L660.3 536.11 L649.78 536.11 L649.78 534.78 L649.78 534.78 ZM664.23 534.78 L674.75 534.78 L674.75 536.11					 L664.23 536.11 L664.23 534.78 L664.23 534.78 ZM678.69 534.78 L689.16 534.78 L689.16 536.11 L678.69 536.11					 L678.69 534.78 L678.69 534.78 ZM693.1 534.78 L698.57 534.78 L698.57 536.11 L693.1 536.11 L693.1 534.78 L693.1					 534.78 Z" class="st12"></path>	</g>	<g id="shape21-41" v:mid="21" v:groupcontext="shape" transform="translate(581.007,-447.294)">		<title></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" class="st13"></path>	</g>	<g id="shape22-44" v:mid="22" v:groupcontext="shape" transform="translate(236.977,-213.851)">		<title></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="shape23-46" v:mid="23" v:groupcontext="shape" transform="translate(225.872,-213.851)">		<title></title>		<path d="M0 502.28 C-0 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="st14"></path>	</g>	<g id="shape24-48" v:mid="24" v:groupcontext="shape" transform="translate(232.566,-208.052)">		<title></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="shape25-50" v:mid="25" v:groupcontext="shape" transform="translate(220.936,-208.052)">		<title></title>		<path d="M0 502.28 C-0 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="st14"></path>	</g>	<g id="shape26-52" v:mid="26" v:groupcontext="shape" transform="translate(228.156,-200.964)">		<title></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="shape27-54" v:mid="27" v:groupcontext="shape" transform="translate(216,-200.964)">		<title></title>		<path d="M0 502.28 C-0 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="st14"></path>	</g>	<g id="shape28-56" v:mid="28" v:groupcontext="shape" transform="translate(225,-223.053)">		<title></title>		<desc>Hardware Based</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="44.2828" cy="530.311" width="88.57" height="11.6025"></v:textrect>		<path d="M88.57 524.51 L0 524.51 L0 536.11 L88.57 536.11 L88.57 524.51" class="st4"></path>		<text x="1.08" y="533.79" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware Based  </text>		</g>	<g id="shape29-60" v:mid="29" v:groupcontext="shape" transform="translate(228.066,-208.252)">		<title></title>		<desc>Sensor Drivers</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="41.0083" cy="530.311" width="82.02" height="11.6025"></v:textrect>		<path d="M82.02 524.51 L0 524.51 L0 536.11 L82.02 536.11 L82.02 524.51" class="st4"></path>		<text x="2.65" y="533.79" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Sensor Drivers</text>		</g>	<g id="shape30-64" v:mid="30" v:groupcontext="shape" transform="translate(236.977,-284.734)">		<title></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="shape31-66" v:mid="31" v:groupcontext="shape" transform="translate(225.872,-284.734)">		<title></title>		<path d="M0 502.28 C-0 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="st6"></path>	</g>	<g id="shape32-68" v:mid="32" v:groupcontext="shape" transform="translate(232.566,-278.935)">		<title></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="shape33-70" v:mid="33" v:groupcontext="shape" transform="translate(220.936,-278.935)">		<title></title>		<path d="M0 502.28 C-0 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="st6"></path>	</g>	<g id="shape34-72" v:mid="34" v:groupcontext="shape" transform="translate(228.156,-272.491)">		<title></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="shape35-74" v:mid="35" v:groupcontext="shape" transform="translate(216,-272.491)">		<title></title>		<path d="M0 502.28 C-0 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="st6"></path>	</g>	<g id="shape36-76" v:mid="36" v:groupcontext="shape" transform="translate(227.877,-292.451)">		<title></title>		<desc>Software Based</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="42.1225" cy="530.311" width="84.25" height="11.6025"></v:textrect>		<path d="M84.25 524.51 L0 524.51 L0 536.11 L84.25 536.11 L84.25 524.51" class="st4"></path>		<text x="1.18" y="533.79" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Software Based  </text>		</g>	<g id="shape37-80" v:mid="37" v:groupcontext="shape" transform="translate(243.63,-280.212)">		<title></title>		<desc>Sensors</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="21.867" cy="530.311" width="43.74" height="11.6025"></v:textrect>		<path d="M43.73 524.51 L0 524.51 L0 536.11 L43.73 536.11 L43.73 524.51" class="st4"></path>		<text x="0.59" y="533.79" class="st15" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Sensors</text>		</g>	<g id="shape38-84" v:mid="38" v:groupcontext="shape" transform="translate(194.761,-111.393)">		<title></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="shape39-86" v:mid="39" v:groupcontext="shape" transform="translate(194.761,-111.393)">		<title></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="shape40-88" v:mid="40" v:groupcontext="shape" transform="translate(204.99,-150.509)">		<title></title>		<desc>Serial Buses</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="43.6145" cy="528.378" width="87.23" height="15.4689"></v:textrect>		<path d="M87.23 520.64 L0 520.64 L0 536.11 L87.23 536.11 L87.23 520.64" class="st4"></path>		<text x="4.93" y="532.24" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Serial Buses</text>		</g>	<g id="shape41-92" v:mid="41" v:groupcontext="shape" transform="translate(507.916,-249.937)">		<title></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="shape42-94" v:mid="42" v:groupcontext="shape" transform="translate(507.916,-249.937)">		<title></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="st6"></path>	</g>	<g id="shape43-96" v:mid="43" v:groupcontext="shape" transform="translate(519.146,-263.392)">		<title></title>		<desc>Platform</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="28.4159" cy="529.151" width="56.84" height="13.9225"></v:textrect>		<path d="M56.83 522.19 L0 522.19 L0 536.11 L56.83 536.11 L56.83 522.19" class="st4"></path>		<text x="6.82" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Platform  </text>		</g>	<g id="shape44-100" v:mid="44" v:groupcontext="shape" transform="translate(523.456,-250.504)">		<title></title>		<desc>Sensors</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="26.2406" cy="529.151" width="52.49" height="13.9225"></v:textrect>		<path d="M52.48 522.19 L0 522.19 L0 536.11 L52.48 536.11 L52.48 522.19" class="st4"></path>		<text x="4.96" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Sensors</text>		</g>	<g id="shape45-104" v:mid="45" v:groupcontext="shape" transform="translate(553.283,-202.897)">		<title></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="shape46-106" v:mid="46" v:groupcontext="shape" transform="translate(553.283,-202.897)">		<title></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="st6"></path>	</g>	<g id="shape47-108" v:mid="47" v:groupcontext="shape" transform="translate(566.499,-216.466)">		<title></title>		<desc>Service</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="25.8238" cy="529.151" width="51.65" height="13.9225"></v:textrect>		<path d="M51.65 522.19 L0 522.19 L0 536.11 L51.65 536.11 L51.65 522.19" class="st4"></path>		<text x="6.49" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Service  </text>		</g>	<g id="shape48-112" v:mid="48" v:groupcontext="shape" transform="translate(567.562,-203.579)">		<title></title>		<desc>Manager</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="28.0968" cy="529.151" width="56.2" height="13.9225"></v:textrect>		<path d="M56.19 522.19 L0 522.19 L0 536.11 L56.19 536.11 L56.19 522.19" class="st4"></path>		<text x="5.21" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Manager</text>		</g>	<g id="shape49-116" v:mid="49" v:groupcontext="shape" transform="translate(204.823,-505.726)">		<title></title>		<desc>Linux OS</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="37.3026" cy="527.218" width="74.61" height="17.7886"></v:textrect>		<path d="M74.61 518.32 L0 518.32 L0 536.11 L74.61 536.11 L74.61 518.32" class="st4"></path>		<text x="4.78" y="531.66" class="st11" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Linux OS</text>		</g>	<g id="shape50-120" v:mid="50" v:groupcontext="shape" transform="translate(204.823,-364.098)">		<title></title>		<desc>QuRT</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="25.0146" cy="527.218" width="50.03" height="17.7886"></v:textrect>		<path d="M50.03 518.32 L0 518.32 L0 536.11 L50.03 536.11 L50.03 518.32" class="st4"></path>		<text x="4.85" y="531.66" class="st11" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>QuRT</text>		</g>	<g id="shape51-124" v:mid="51" v:groupcontext="shape" transform="translate(248.3,-364.098)">		<title></title>		<desc>OS</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="14.591" cy="527.218" width="29.19" height="17.7886"></v:textrect>		<path d="M29.18 518.32 L0 518.32 L0 536.11 L29.18 536.11 L29.18 518.32" class="st4"></path>		<text x="3.88" y="531.66" class="st11" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>OS</text>		</g>	<g id="shape52-128" v:mid="52" v:groupcontext="shape" transform="translate(187.83,-401.423)">		<title></title>		<path d="M0 406.92 L528.65 406.92 L528.65 536.11 L0 536.11 L0 406.92" class="st13"></path>	</g>	<g id="shape53-131" v:mid="53" v:groupcontext="shape" transform="translate(598.65,-249.937)">		<title></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="shape54-133" v:mid="54" v:groupcontext="shape" transform="translate(598.65,-249.937)">		<title></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="st6"></path>	</g>	<g id="shape55-135" v:mid="55" v:groupcontext="shape" transform="translate(616.712,-256.945)">		<title></title>		<desc>Utilities</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="23.4237" cy="529.151" width="46.85" height="13.9225"></v:textrect>		<path d="M46.85 522.19 L0 522.19 L0 536.11 L46.85 536.11 L46.85 522.19" class="st4"></path>		<text x="4.73" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Utilities</text>		</g>	<g id="shape56-139" v:mid="56" v:groupcontext="shape" transform="translate(403.951,-193.231)">		<title></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="st6"></path>	</g>	<g id="shape57-141" v:mid="57" v:groupcontext="shape" transform="translate(-111.707,334.249) rotate(-90)">		<title></title>		<desc>QSH Sensor API</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="64.5947" cy="527.415" width="129.19" height="17.3941"></v:textrect>		<path d="M129.19 536.11 L129.19 518.72 L0 518.72 L0 536.11 L129.19 536.11" class="st4"></path>		<text x="10.23" y="531.76" class="st16" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>QSH Sensor API</text>		</g>	<g id="shape58-145" v:mid="58" v:groupcontext="shape" transform="translate(499.725,-193.231)">		<title></title>		<path d="M0 395.64 L179.58 395.64 L179.58 536.11 L0 536.11 L0 395.64" class="st13"></path>	</g>	<g id="shape59-148" v:mid="59" v:groupcontext="shape" transform="translate(581.007,-322.753)">		<title></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="st17"></path>	</g>	<g id="shape61-150" v:mid="61" v:groupcontext="shape" transform="translate(330.861,-289.889)">		<title></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="shape62-152" v:mid="62" v:groupcontext="shape" transform="translate(330.861,-289.889)">		<title></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" class="st13"></path>	</g>	<g id="shape63-155" v:mid="63" v:groupcontext="shape" transform="translate(427.265,-254.448)">		<title></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="shape64-157" v:mid="64" v:groupcontext="shape" transform="translate(427.265,-254.448)">		<title></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" class="st13"></path>	</g>	<g id="shape65-160" v:mid="65" v:groupcontext="shape" transform="translate(270.372,-170.677)">		<title></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="st18"></path>	</g>	<g id="shape66-162" v:mid="66" v:groupcontext="shape" transform="translate(270.372,-170.677)">		<title></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" class="st19"></path>	</g>	<g id="shape67-165" v:mid="67" v:groupcontext="shape" transform="translate(330.861,-219.006)">		<title></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="shape68-167" v:mid="68" v:groupcontext="shape" transform="translate(330.861,-219.006)">		<title></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" class="st13"></path>	</g>	<g id="shape69-170" v:mid="69" v:groupcontext="shape" transform="translate(187.83,-36)">		<title></title>		<path d="M0 472.96 L528.65 472.96 L528.65 536.11 L0 536.11 L0 472.96" class="st13"></path>	</g>	<g id="shape70-173" v:mid="70" v:groupcontext="shape" transform="translate(402.084,-37.2538)">		<title></title>		<desc>Sensor Hardware</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="59.6005" cy="524.514" width="119.21" height="23.198"></v:textrect>		<path d="M119.2 512.91 L0 512.91 L0 536.11 L119.2 536.11 L119.2 512.91" class="st4"></path>		<text x="6.6" y="528.38" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Sensor Hardware</text>		</g>	<g id="shape71-177" v:mid="71" v:groupcontext="shape" transform="translate(200.432,-63.7087)">		<title></title>		<path d="M0 512.91 L0 536.11 L90.73 536.11 L90.73 512.91 L0 512.91 L0 512.91 Z" class="st20"></path>	</g>	<g id="shape72-179" v:mid="72" v:groupcontext="shape" transform="translate(200.432,-63.7087)">		<title></title>		<path d="M0 512.91 L90.73 512.91 L90.73 536.11 L0 536.11 L0 512.91" class="st13"></path>	</g>	<g id="shape73-182" v:mid="73" v:groupcontext="shape" transform="translate(202.69,-66.7526)">		<title></title>		<desc>Accelerometer</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="44.8097" cy="529.151" width="89.62" height="13.9225"></v:textrect>		<path d="M89.62 522.19 L0 522.19 L0 536.11 L89.62 536.11 L89.62 522.19" class="st4"></path>		<text x="6.13" y="532.75" class="st21" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Accelerometer</text>		</g>	<g id="shape74-186" v:mid="74" v:groupcontext="shape" transform="translate(303.767,-61.1312)">		<title></title>		<path d="M0 510.34 L0 536.11 L90.73 536.11 L90.73 510.34 L0 510.34 L0 510.34 Z" class="st20"></path>	</g>	<g id="shape75-188" v:mid="75" v:groupcontext="shape" transform="translate(303.767,-63.0643)">		<title></title>		<path d="M0 512.27 L90.73 512.27 L90.73 536.11 L0 536.11 L0 512.27" class="st13"></path>	</g>	<g id="shape76-191" v:mid="76" v:groupcontext="shape" transform="translate(318.952,-66.6604)">		<title></title>		<desc>Gyroscope</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="34.024" cy="529.151" width="68.05" height="13.9225"></v:textrect>		<path d="M68.05 522.19 L0 522.19 L0 536.11 L68.05 536.11 L68.05 522.19" class="st4"></path>		<text x="5.01" y="532.75" class="st21" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Gyroscope</text>		</g>	<g id="shape77-195" v:mid="77" v:groupcontext="shape" transform="translate(406.472,-61.8561)">		<title></title>		<desc>Magnetometer</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45.3666" cy="523.587" width="90.74" height="25.0506"></v:textrect>		<path d="M0 511.06 L0 536.11 L90.73 536.11 L90.73 511.06 L0 511.06 L0 511.06 Z" class="st20"></path>		<text x="6.68" y="527.19" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Magnetometer</text>		</g>	<g id="shape78-198" v:mid="78" v:groupcontext="shape" transform="translate(406.472,-63.7087)">		<title></title>		<path d="M0 512.91 L90.73 512.91 L90.73 536.11 L0 536.11 L0 512.91" class="st13"></path>	</g>	<g id="shape85-201" v:mid="85" v:groupcontext="shape" transform="translate(612.512,-63.7087)">		<title></title>		<path d="M0 512.91 L0 536.11 L90.73 536.11 L90.73 512.91 L0 512.91 L0 512.91 Z" class="st2"></path>	</g>	<g id="shape88-203" v:mid="88" v:groupcontext="shape" transform="translate(242.333,-86.6651)">		<title></title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67					 L6.3 529.67 L6.3 529.67 Z" class="st12"></path>	</g>	<g id="shape89-205" v:mid="89" v:groupcontext="shape" transform="translate(345.668,-86.6651)">		<title></title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67					 L6.3 529.67 L6.3 529.67 Z" class="st12"></path>	</g>	<g id="shape90-207" v:mid="90" v:groupcontext="shape" transform="translate(448.373,-86.6651)">		<title></title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67					 L6.3 529.67 L6.3 529.67 Z" class="st12"></path>	</g>	<g id="shape91-209" v:mid="91" v:groupcontext="shape" transform="translate(551.708,-86.6651)">		<title></title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67					 L6.3 529.67 L6.3 529.67 Z" class="st12"></path>	</g>	<g id="shape92-211" v:mid="92" v:groupcontext="shape" transform="translate(654.413,-86.6651)">		<title></title>		<path d="M3.82 511.06 L3.82 530.76 L2.52 530.76 L2.52 511.06 L3.82 511.06 L3.82 511.06 ZM6.3 529.67 L3.15 536.11 L0 529.67					 L6.3 529.67 L6.3 529.67 Z" class="st12"></path>	</g>	<g id="shape93-213" v:mid="93" v:groupcontext="shape" transform="translate(187.83,-105.594)">		<title></title>		<path d="M0 253.23 L528.65 253.23 L528.65 536.11 L0 536.11 L0 253.23" class="st13"></path>	</g>	<g id="shape94-216" v:mid="94" v:groupcontext="shape" transform="translate(327.71,-129.436)">		<title></title>		<path d="M0 516.78 C-0 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="shape95-218" v:mid="95" v:groupcontext="shape" transform="translate(327.71,-129.436)">		<title></title>		<path d="M0 516.78 C-0 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="st6"></path>	</g>	<g id="shape96-220" v:mid="96" v:groupcontext="shape" transform="translate(344.472,-132.625)">		<title></title>		<desc>I3C</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="12.1525" cy="529.151" width="24.31" height="13.9225"></v:textrect>		<path d="M24.3 522.19 L0 522.19 L0 536.11 L24.3 536.11 L24.3 522.19" class="st4"></path>		<text x="3.13" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>I3C</text>		</g>	<g id="shape97-224" v:mid="97" v:groupcontext="shape" transform="translate(393.24,-129.436)">		<title></title>		<path d="M0 516.78 C-0 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="shape98-226" v:mid="98" v:groupcontext="shape" transform="translate(393.24,-129.436)">		<title></title>		<path d="M0 516.78 C-0 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="st6"></path>	</g>	<g id="shape99-228" v:mid="99" v:groupcontext="shape" transform="translate(410.354,-132.625)">		<title></title>		<desc>SPI</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="12.5237" cy="529.151" width="25.05" height="13.9225"></v:textrect>		<path d="M25.05 522.19 L0 522.19 L0 536.11 L25.05 536.11 L25.05 522.19" class="st4"></path>		<text x="3.18" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SPI</text>		</g>	<g id="shape100-232" v:mid="100" v:groupcontext="shape" transform="translate(459.399,-129.436)">		<title></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="shape101-234" v:mid="101" v:groupcontext="shape" transform="translate(459.399,-129.436)">		<title></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="st6"></path>	</g>	<g id="shape102-236" v:mid="102" v:groupcontext="shape" transform="translate(476.231,-132.625)">		<title></title>		<desc>I2C</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="12.1525" cy="529.151" width="24.31" height="13.9225"></v:textrect>		<path d="M24.3 522.19 L0 522.19 L0 536.11 L24.3 536.11 L24.3 522.19" class="st4"></path>		<text x="3.13" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>I2C</text>		</g>	<g id="shape103-240" v:mid="103" v:groupcontext="shape" transform="translate(524.929,-129.436)">		<title></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="shape104-242" v:mid="104" v:groupcontext="shape" transform="translate(524.929,-129.436)">		<title></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="st6"></path>	</g>	<g id="shape105-244" v:mid="105" v:groupcontext="shape" transform="translate(535.137,-132.625)">		<title></title>		<desc>UART</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="19.9292" cy="529.151" width="39.86" height="13.9225"></v:textrect>		<path d="M39.86 522.19 L0 522.19 L0 536.11 L39.86 536.11 L39.86 522.19" class="st4"></path>		<text x="4.14" y="532.63" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>UART</text>		</g>	<g id="shape110-248" v:mid="110" v:groupcontext="shape" transform="translate(508.5,-62.0484)">		<title></title>		<desc>ALS/Prox</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45.3666" cy="523.587" width="90.74" height="25.0506"></v:textrect>		<rect x="0" y="511.062" width="90.7332" height="25.0506" class="st23"></rect>		<text x="20.02" y="527.19" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>ALS/Prox</text>		</g>	<g id="shape111-251" v:mid="111" v:groupcontext="shape" transform="translate(612.512,-63.7087)">		<title></title>		<desc>Other sensors</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45.3666" cy="524.514" width="90.74" height="23.198"></v:textrect>		<rect x="0" y="512.915" width="90.7332" height="23.198" class="st23"></rect>		<text x="7.68" y="528.11" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Other sensors</text>		</g>	<g id="shape112-254" v:mid="112" v:groupcontext="shape" transform="translate(237.375,-6.401)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.375" cy="524.514" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67484 9.67484 -180 0 0 96.75 526.44 L96.75 522.59 A9.67484 9.67484 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67484 9.67484 -180 0 0 0 522.59 L0 526.44 A9.67484 9.67484 -180 0 0 9.68 536.11 Z" class="st24"></path>		<text x="19.37" y="528.11" class="st25" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Third-party</text>		</g>	<g id="shape114-257" v:mid="114" v:groupcontext="shape" transform="translate(361.125,-6.401)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.375" cy="524.514" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67484 9.67484 -180 0 0 96.75 526.44 L96.75 522.59 A9.67484 9.67484 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67484 9.67484 -180 0 0 -0 522.59 L0 526.44 A9.67484 9.67484 -180 0 0 9.68 536.11					 Z" class="st26"></path>		<text x="22.37" y="528.11" class="st25" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Upstream</text>		</g>	<g id="shape116-260" v:mid="116" v:groupcontext="shape" transform="translate(484.875,-6.401)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.375" cy="524.514" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67484 9.67484 -180 0 0 96.75 526.44 L96.75 522.59 A9.67484 9.67484 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67484 9.67484 -180 0 0 -0 522.59 L0 526.44 A9.67484 9.67484 -180 0 0 9.68 536.11					 Z" class="st27"></path>		<text x="19.37" y="528.11" class="st25" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Qualcomm</text>		</g>	<g id="shape118-263" v:mid="118" v:groupcontext="shape" transform="translate(608.625,-6.401)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.1343750010047):1"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="48.375" cy="524.514" width="96.76" height="23.198"></v:textrect>		<path d="M9.68 536.11 L87.08 536.11 A9.67484 9.67484 -180 0 0 96.75 526.44 L96.75 522.59 A9.67484 9.67484 -180 0 0 87.08					 512.91 L9.68 512.91 A9.67484 9.67484 -180 0 0 -0 522.59 L0 526.44 A9.67484 9.67484 -180 0 0 9.68 536.11					 Z" class="st28"></path>		<text x="22.37" y="528.11" class="st22" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Hardware</text>		</g></g>
</svg>

The following table lists the QSH terminology to understand the QSH framework and its
            usage.

Table : QSH terminology

| **Item** | **Description** |
| --- | --- |
| Sensor | <ul class="ul" id="architecture__ul_iy1_bt4_p1c_monicapa_03-02-24-1018-25-808"><br>                                    <li class="li">Produces a single type of data, for example, accelerometer,<br>                                    gyroscope, timer, interrupt, and rotation vector</li><br><br>                                    <li class="li">Handles asynchronous data</li><br><br>                                    <li class="li">Publishes mandatory and custom attributes, and manages its<br>                                    instances</li><br><br>                                </ul> |
| Sensor instance | <ul class="ul" id="architecture__ul_msk_ft4_p1c_monicapa_03-02-24-1019-42-720"><br>                                    <li class="li">Runs at a specific configuration, publishes output data<br>                                    events, and can be created per client request or shared among<br>                                    multiple requests</li><br><br>                                    <li class="li">Physical sensors usually share a single instance</li><br><br>                                </ul> |
| Sensor unique identifier (SUID) | A unique 128‑bit ID for each sensor |
| Service | A module that provides a synchronous interface for common<br>                                utilities |
| Data stream | A unique connection between a client and data source |
| Request | A configuration message sent by a client to a sensor (see<br>                                    `sns_request.h` file) |
| Event | Asynchronous output data message generated by a sensor instance<br>                                (see `sns_sensor_event.h` file) |
| Nanopb | Nanopb is a small code-size protocol buffer implemented in ANSI<br>                                C |

The following resources give an in-depth information on the QSH architecture:

- **Application processor software modules**
    - **Application processor**: The block contains the *application main()                            or entry function* that interacts with the QSH client APIs on the
                        application processor side.
    - **QSH client APIs**: The block offers high-level APIs to access services
                        offered by the QSH. It simplifies application development by abstracting
                        system complexities and enables it to focus on the application logic. For more information, see [Interfaces](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-7/qsh_api_reference.html).
- **Low-power processor software modules**
    - **Client manager**: The block is in charge of all communications of the
                        low-power processor with the application processor. The client manager is
                        responsible for the following:
        - Translates incoming requests: The client manager takes incoming
                                requests and translates them into a format that the QSH can
                                understand.
        - Translates outgoing indications: When the client manager receives
                                event messages from the QSH, the client manager translates these
                                event messages into outgoing indications in a format that can be
                                understood outside the QSH.
        - Guarantees batching options: If a client specifies certain batching
                                (store/accumulate locally) options, then the client manager ensures
                                that the batching options are met. This means it checks that the
                                data is grouped and sent in the way that the client has
                                specified.
    - **Service manager**: QSH offers synchronous services through its service
                        manager. The sensor and sensor instance APIs use a callback to connect to
                        this service manager. 
        The services available in the QSH, also referred as
                            QSH services, are listed in the
                                `adsp_proc/qsh_platform/inc/sns_service.h` file. The
                            following table describes the key QSH services that are essential for
                            device drivers.

Table : QSH services

        | QSH service | Description |
        | --- | --- |
        | Stream service | <ul class="ul"><br>                                                <li class="li">The stream service provides the ability to<br>                                                  create and remove a data stream with a<br>                                                  sensor.</li><br><br>                                                <li class="li">See the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/sns_data_stream.h</code><br>                                                  file for data stream API to send requests and<br>                                                  receive events over the data streams.</li><br><br>                                            </ul> |
        | Attribute service | <ul class="ul"><br>                                                <li class="li">The attribute service allows a sensor to publish<br>                                                  its attributes or capabilities.</li><br><br>                                                <li class="li">All standard attribute IDs and expected value<br>                                                  type are defined in the<br>                                                  <code class="ph codeph">sns_std_sensor.proto</code> file.</li><br><br>                                                <li class="li">All attribute values must be in the<br>                                                  nanopb-encoded format.</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_attribute_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Diagnostic service | <ul class="ul"><br>                                                <li class="li">The diagnostic service provides debug message<br>                                                  and data log packet services, and defines standard<br>                                                  log packet IDs.</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_diag_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Event service | <ul class="ul"><br>                                                <li class="li">The event service provides the ability to<br>                                                  publish output events from source sensor<br>                                                  instances.</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_event_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Power rail service | <ul class="ul"><br>                                                <li class="li">The power rail service is available to the<br>                                                  physical sensors to register and vote for the<br>                                                  power rails (ON/OFF).</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_pwr_rail_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Synchronous COM port (SCP) service | <ul class="ul"><br>                                                <li class="li">The SCP service is available to the physical<br>                                                  sensors to register/deregister the COM port and<br>                                                  perform synchronous transfers over the COM<br>                                                  port.</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_sync_com_port_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
        | GPIO service | <ul class="ul"><br>                                                <li class="li">The GPIO service is available to the physical<br>                                                  sensors to read/write the GPIO value.</li><br><br>                                                <li class="li">The service effectively abstracts a low-level<br>                                                  CoreBSP layer for controlling the GPIOs.</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_gpio_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Island service | <ul class="ul"><br>                                                <li class="li">The island service is available to the physical<br>                                                  sensors to request for island exit.</li><br><br>                                                <li class="li">When an application must access DDR or<br>                                                  non-island resources, the application code can use<br>                                                  the island service.</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_island_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
        | File system service | <ul class="ul"><br>                                                <li class="li">The file system service is available to the<br>                                                  physical sensors for the file service<br>                                                  management.</li><br><br>                                                <li class="li">The abstract file system is a part of an<br>                                                  application processor stack and can be available<br>                                                  for local access from a low-power processor.</li><br><br>                                                <li class="li">For more information on the API, see the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/inc/services/sns_file_service.h</code><br>                                                  file.</li><br><br>                                            </ul> |
    - **Platform sensor**: QSH provides some built-in sensors for platform or
                        hardware-specific abstraction that can be used by other sensors and sensor
                        instances. The following table describes the platform sensors. 

Table : Platform sensors

        | Platform sensor | Description |
        | --- | --- |
        | Registry sensor | <ul class="ul" id="architecture__ul_alm_4gl_sbc_rajearor_06-13-24-1518-34-750"><br>                                                <li class="li">The registry sensor in the QSH provides an<br>                                                  interface for sensors to access registry data from<br>                                                  persistent memory. It allows sensors to create a<br>                                                  data stream, send requests, receive data events,<br>                                                  subscribe to updates, and remove unnecessary data<br>                                                  streams.</li><br><br>                                                <li class="li">For more information on the registry sensor, see<br>                                                  <em class="ph i">Configure</em> in <a href="https://docs.qualcomm.com/bundle/resource/topics/80-70014-7A/overview.html" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://docs.qualcomm.com/bundle/resource/topics/80-70014-7A/overview.html')">Qualcomm Linux<br>                                                  Sensors Guide - Addendum</a>.<br>                                                    <div class="note note" id="architecture__note_cfv_gn4_vbc_rajearor_06-24-24-1929-30-361"><span class="notetitle">Note:</span> <a href="https://docs.qualcomm.com/bundle/resource/topics/80-70014-7A/overview.html" target="_blank" class="xref cursorpointer" onclick="Window.BookmapComponent.navigateExternalFile('https://docs.qualcomm.com/bundle/resource/topics/80-70014-7A/overview.html')">Qualcomm Linux<br>                                                  Sensors Guide - Addendum</a> is accessible only<br>                                                  to the Authorized users.</div><br></li><br><br>                                                <li class="li">The registry sensor API is documented in the<br>                                                  <code class="ph codeph">adsp_proc/qsh_api/pb/sns_registry.proto</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Timer sensor | <ul class="ul" id="architecture__ul_t2g_qgl_sbc_rajearor_06-13-24-1519-5-683"><br>                                                <li class="li">The timer sensor in the QSH offers an interface<br>                                                  to initiate periodic or one-shot timers. Sensors<br>                                                  that require timers must create a data stream,<br>                                                  send requests, and read delivered data<br>                                                  events.</li><br><br>                                                <li class="li">The timer sensor API is documented in the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/api/public_sns/sns_timer.proto</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Interrupt sensor | <ul class="ul" id="architecture__ul_tts_rgl_sbc_rajearor_06-13-24-1519-31-762"><br>                                                <li class="li">The interrupt sensor in the QSH offers an<br>                                                  interface for registering interrupts. Sensors<br>                                                  requiring interrupts must create a data stream,<br>                                                  send requests, and read delivered data<br>                                                  events.</li><br><br>                                                <li class="li">The interrupt sensor API is documented in the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/api/public_sns/sns_interrupt.proto</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Asynchronous COM port (ASCP) sensor | <ul class="ul" id="architecture__ul_lxc_tgl_sbc_rajearor_06-13-24-1519-56-193"><br>                                                <li class="li">The ASCP sensor in the QSH offers an interface<br>                                                  for asynchronous read/write operations over a<br>                                                  communication port.</li><br><br>                                                <li class="li">Sensors that require this feature must create a<br>                                                  data stream, send requests, and read delivered<br>                                                  data events.</li><br><br>                                                <li class="li">The ASCP sensor API is documented in the<br>                                                  <code class="ph codeph">adsp_proc/qsh_platform/api/public_sns/sns_async_com_port.proto</code><br>                                                  file.</li><br><br>                                            </ul><br><br>                                            <br>Note: The ASCP sensor is typically used by the physical<br>                                                sensor drivers to read large FIFO. |
        | SUID lookup sensor | <ul class="ul" id="architecture__ul_rrs_wgl_sbc_rajearor_06-13-24-1520-59-587"><br>                                                <li class="li">The SUID lookup sensor in the QSH provides an<br>                                                  API to obtain the SUID of dependent sensors. Its<br>                                                  own SUID is available via the<br>                                                  <code class="ph codeph">sns_get_suid_lookup()</code> function in<br>                                                  the <code class="ph codeph">sns_sensor_util.h</code> file.</li><br><br>                                                <li class="li">The SUID lookup sensor API is documented in the<br>                                                  <code class="ph codeph">adsp_proc/qsh_api/pb/sns_suid.proto</code><br>                                                  file.</li><br><br>                                            </ul> |
        | Test sensor | A test sensor is available in the<br>                                                  `adsp_proc/qsh_platform/sensors/test`<br>                                                directory to customize and run sensor-specific use<br>                                                cases. |
    - **QSH utilities**: QSH provides several helper utilities for sensors and sensor
                            instances. For all available utilities, see
                            `adsp_proc/qsh_platform/inc/utils` directory. The following table describes the key utilities.

Table : QSH utilities

        | QSH utility | Description |
        | --- | --- |
        | Nanopb encode/decode | <ul class="ul" id="architecture__ul_nkh_lhl_n1c_monicapa_02-23-24-1918-46-547"><br>                                            <li class="li">Provides common encode/decode helper functions for all<br>                                                the sensors. For example, encode/decode<br>                                                <code class="ph codeph">sns_request</code> messages, encode and<br>                                                publish/decode data events.</li><br><br>                                            <li class="li">Asynchronous COM port nanopb utilities are available for<br>                                                physical sensor drivers.</li><br><br>                                        </ul> |
        | Sensor utils | <ul class="ul" id="architecture__ul_okh_lhl_n1c_monicapa_02-23-24-1918-46-547"><br>                                            <li class="li">Provides common functionality, such as finding a sensor<br>                                                instance and getting the SUID of a SUID lookup<br>                                                sensor.</li><br><br>                                        </ul> |
        | Attribute utils | <ul class="ul" id="architecture__ul_pkh_lhl_n1c_monicapa_02-23-24-1918-46-547"><br>                                            <li class="li">Provides helper function that encodes and publishes a<br>                                                sensor attribute.</li><br><br>                                        </ul> |
        | Memory, math, and printf utils. |  |

## Communication between sensors

Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html)

Every algorithm and sensor driver within the QSH framework, is referred to as a sensor
            with the standard QSH APIs. Information exchange across these sensors is necessary for
            any real use case. The following resources describe about the communication between
            these sensors.

All communication to, from, and among the sensors is performed through the request and
            event messages over data streams. Message payloads are defined in the protocol buffer
            format, using the nanopb generator, encoder, and decoder. Message payload length,
            message ID, and timestamp (in the case of events) are communicated within metadata
            managed by the QSH framework.

Figure : Sensor communication
                
                <?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">
<!-- Generated by Microsoft Visio, SVG Export Sensor_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.75694in" height="2.81944in" viewbox="0 0 558.5 203" xml:space="preserve" color-interpolation-filters="sRGB" class="st12"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<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: #ffffff; 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: 1 }
.svg-2 .st4 { fill: #4a5a75; stroke: #000000; stroke-width: 2 }
.svg-2 .st5 { fill: #f7f8fa; font-family: Arial; font-size: 1.00001em }
.svg-2 .st6 { font-size: 1em }
.svg-2 .st7 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-2 .st8 { marker-end: url("#mrkr5-43"); marker-start: url("#mrkr5-41"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-2 .st9 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409090909091 }
.svg-2 .st10 { fill: #4a5a75; stroke: #c7c8c8; stroke-width: 0.25 }
.svg-2 .st11 { fill: #feffff; font-family: Calibri; font-size: 1.00001em }
.svg-2 .st12 { 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-41" class="st9" v:arrowtype="5" v:arrowsize="2" v:setback="5.8" refx="5.8" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(3.52) "></use>	</marker>	<marker id="mrkr5-43" class="st9" v:arrowtype="5" v:arrowsize="2" v:setback="6.16" refx="-6.16" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(-3.52,-3.52) "></use>	</marker></defs><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="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape33-1" v:mid="33" v:groupcontext="shape" transform="translate(18.25,-18.25)">		<title></title>		<rect x="0" y="36.5" width="533" height="166.5" class="st1"></rect>	</g>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(31.8436,-44.3716)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.27474977989197):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.27474977989197):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.27474977989197):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.27474977989197):1"></v:ud>		</v:userdefs>		<path d="M19.78 203 L107.16 203 A19.7817 19.7817 -180 0 0 126.94 183.22 L126.94 140.52 A19.7817 19.7817 -180 0 0 107.16					 120.74 L19.78 120.74 A19.7817 19.7817 -180 0 0 0 140.52 L0 183.22 A19.7817 19.7817 -180 0 0 19.78 203 Z" class="st2"></path>	</g>	<g id="shape3-5" v:mid="3" v:groupcontext="shape" transform="translate(397.532,-44.3752)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.30889286693996):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.30889286693996):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.30889286693996):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.30889286693996):1"></v:ud>		</v:userdefs>		<path d="M22.24 203 L120.48 203 A22.2399 22.2399 -180 0 0 142.72 180.76 L142.72 142.98 A22.2399 22.2399 -180 0 0 120.48					 120.74 L22.24 120.74 A22.2399 22.2399 -180 0 0 -0 142.98 L0 180.76 A22.2399 22.2399 -180 0 0 22.24 203 Z" class="st2"></path>	</g>	<g id="shape30-7" v:mid="30" v:groupcontext="shape" transform="translate(158.787,-66.9504)">		<title></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 203 L13.97 183.4 L13.97 193.2 L238.08 193.2 L238.08 203 L238.08 212.8 L13.97 212.8 L13.97 222.6 L0 203 Z" class="st3"></path>	</g>	<g id="shape29-9" v:mid="29" v:groupcontext="shape" transform="translate(396.079,302.74) rotate(180)">		<title></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 203 L12 184.48 L12 193.74 L236.82 193.74 L236.82 203 L236.82 212.26 L12 212.26 L12 221.52 L0 203 Z" class="st3"></path>	</g>	<g id="shape22-11" v:mid="22" v:groupcontext="shape" transform="translate(96.3772,-55.8232)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.15872530589669):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15872530589669):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15872530589669):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15872530589669):1"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.44" cy="173.318" width="56.89" height="59.364"></v:textrect>		<path d="M11.43 203 L45.45 203 A11.428 11.428 -180 0 0 56.88 191.57 L56.88 155.06 A11.428 11.428 -180 0 0 45.45 143.64					 L11.43 143.64 A11.428 11.428 -180 0 0 -0 155.06 L0 191.57 A11.428 11.428 -180 0 0 11.43 203 Z" class="st4"></path>		<text x="20.44" y="162.52" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>PB <tspan x="6.42" dy="1.2em" class="st6">Encode/</tspan><tspan x="7.76" dy="1.2em" class="st6">Decode</tspan></text>		</g>	<g id="shape21-16" v:mid="21" v:groupcontext="shape" transform="translate(403.054,-55.8232)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.21203560955349):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.21203560955349):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.21203560955349):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.21203560955349):1"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="32.3856" cy="173.318" width="64.78" height="59.364"></v:textrect>		<path d="M15.27 203 L49.5 203 A15.2663 15.2663 -180 0 0 64.77 187.73 L64.77 158.9 A15.2663 15.2663 -180 0 0 49.5 143.64					 L15.27 143.64 A15.2663 15.2663 -180 0 0 -0 158.9 L0 187.73 A15.2663 15.2663 -180 0 0 15.27 203 Z" class="st4"></path>		<text x="24.38" y="162.52" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>PB <tspan x="10.37" dy="1.2em" class="st6">Encode/</tspan><tspan x="11.7" dy="1.2em" class="st6">Decode</tspan></text>		</g>	<g id="shape23-21" v:mid="23" v:groupcontext="shape" transform="translate(243.25,-100.15)">		<title></title>		<desc>Request</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.44" cy="199.04" width="56.88" height="7.92"></v:textrect>		<rect x="0" y="195.08" width="56.88" height="7.92" class="st1"></rect>		<text x="6.09" y="202.64" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Request</text>		</g>	<g id="shape24-24" v:mid="24" v:groupcontext="shape" transform="translate(243.25,-62.896)">		<title></title>		<desc>Event</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.44" cy="197.75" width="56.88" height="10.5"></v:textrect>		<rect x="0" y="192.5" width="56.88" height="10.5" class="st1"></rect>		<text x="13.1" y="201.35" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Event</text>		</g>	<g id="shape25-27" v:mid="25" v:groupcontext="shape" transform="translate(36,-70.63)">		<title></title>		<desc>Data Client</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.44" cy="186.8" width="56.89" height="32.4"></v:textrect>		<rect x="0" y="170.6" width="56.88" height="32.4" class="st1"></rect>		<text x="15.77" y="183.2" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Data <tspan x="13.1" dy="1.2em" class="st6">Client</tspan></text>		</g>	<g id="shape26-31" v:mid="26" v:groupcontext="shape" transform="translate(477,-69.3052)">		<title></title>		<desc>Data Source</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="28.44" cy="186.8" width="56.89" height="32.4"></v:textrect>		<rect x="0" y="170.6" width="56.88" height="32.4" class="st1"></rect>		<text x="15.77" y="183.2" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Data <tspan x="9.43" dy="1.2em" class="st6">Source</tspan></text>		</g>	<g id="shape27-35" v:mid="27" v:groupcontext="shape" v:layermember="0" transform="translate(95.3152,-117.633)">		<title></title>		<path d="M0 188.2 L0 187.84 L0 180.5 L373.58 180.5 L373.58 187.84" class="st8"></path>	</g>	<g id="shape31-44" v:mid="31" v:groupcontext="shape" transform="translate(231.683,-152.105)">		<title></title>		<desc>Data Stream</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="40.0068" cy="194.144" width="80.02" height="17.712"></v:textrect>		<rect x="0" y="185.288" width="80.0136" height="17.712" class="st1"></rect>		<text x="6.33" y="197.74" class="st7" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Data Stream</text>		</g>	<g id="shape35-47" v:mid="35" v:groupcontext="shape" transform="translate(383.486,-21.1304)">		<title></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.15):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.15):1"></v:ud>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="TopLeftOffset" v:prompt="" v:val="VT0(0.11113):1"></v:ud>			<v:ud v:nameu="TopRightOffset" v:prompt="" v:val="VT0(0.11113):1"></v:ud>			<v:ud v:nameu="BotLeftOffset" v:prompt="" v:val="VT0(0.11113):1"></v:ud>			<v:ud v:nameu="BotRightOffset" v:prompt="" v:val="VT0(0.11113):1"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="40.0068" cy="194.144" width="80.02" height="17.712"></v:textrect>		<path d="M8 203 L72.01 203 A8.00123 8.00123 -180 0 0 80.01 195 L80.01 193.29 A8.00123 8.00123 -180 0 0 72.01 185.29 L8					 185.29 A8.00123 8.00123 -180 0 0 0 193.29 L0 195 A8.00123 8.00123 -180 0 0 8 203 Z" class="st10"></path>		<text x="12.63" y="197.74" class="st11" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Third-party</text>		</g></g>
</svg>

Request messages are sent to enable, disable, and/or reconfigure a sensor. Request
            messages are always addressed to a specific SUID. After the target sensor receives the
            request message, it sends the request to the sensor instance for proper handling. Sensor
            instances send event messages asynchronously to their registered clients, which may be
            other sensors or sensor instances.

### Sensor and sensor instances

- Sensors are producers and/or consumers of asynchronous data
- Each sensor can have one or more sensor instances
    - Each sensor instance operates with a specific configuration
    - Any request to a sensor for data, results in the creation of a
                                sensor instance or sharing of an existing sensor instance
- Sensor instances are created on-demand, as determined by the sensor
    - Sensors fully manage the lifecycle and configuration of their
                                corresponding instances and are responsible for sending
                                configuration updates and initial state events to their clients
    - Vendors should serve all client requests with as few sensor
                                instances as possible
    - A stream of data generated by a sensor instance is sent to all the
                                active clients
- Multiple sensors can share and configure a single sensor instance ‒ this
                        mode of operation is typically for a combo driver for hardware sensors.
                        Here, the sensors represent the supported data types, and the sensor
                        instance is the sole module that communicates and configures the
                        hardware.

## Nanopb protocol buffer in QSH

Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html)

The QSH uses nanopb protocol buffer for:

- All the request and event messages exchanged between the sensors
    - A sensor/sensor instance must encode the payload (if present) for all
                            requests it sends to its dependants.
    - A sensor/sensor instance must decode the payload (if present) for all
                            requests it receives.
    - A sensor/sensor instance must encode the payload (if present) for all
                            events it publishes.
    - A sensor/sensor instance must decode the payload (if present) for all
                            events it receives from its dependants.
    - Some requests/events do not have a message body. In this case,
                            decoding/encoding the payload is not expected. Such messages are
                            processed by their message ID.
- Representing the attribute data
    - All attribute values are in the nanopb-encoded format
- Diag log packet payload
    - All payloads in the diag log packets are in the nanopb-encoded
                            format

For more information on Google protocol buffers and nanopb respectively, see [Protocol-buffers](https://developers.google.com/protocol-buffers/) and [nanopb](https://jpa.kapsi.fi/nanopb/).

## Sensor API messages

Source: [https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html](https://docs.qualcomm.com/doc/80-70014-7/topic/architecture.html)

The following API messages are used for communication between sensors:

- The `.proto`files contain the following elements for communication
                between sensors:
    - Protocol buffer message definitions
    - Documentation
- The following table lists the standard message definitions in the
                    `<workspace>/build-qcom-wayland/workspace/sources/sensinghub/sensing-hub/apis/proto/sns_std_*.proto`
                    file:

Table : Standard proto files

    | File | Description |
    | --- | --- |
    | `sns_std.proto` | This file includes standard definitions, such as a message<br>                                    ID, request message, batching specification, an attribute<br>                                    request and event, and an error event. |
    | `sns_std_sensor.proto` | This file includes definitions, such as message IDs for<br>                                    request and event APIs of standard sensors, streaming and event<br>                                    messages, sensor sample status types, standard attribute IDs,<br>                                    common attribute types, and a physical sensor configuration<br>                                    event message. |
    | `sns_std_type.proto` | This file includes common API-type definitions, such as SUID<br>                                    messages, attribute events and value messages, and common error<br>                                    types. |
    | `sns_std_event_gated_sensor.proto` | This file includes the API for event gated sensors,<br>                                    encompassing the configuration message ID and API<br>                                    documentation. |

- Physical sensor-specific API definitions and documentation are present in the
                sensor-specific `.proto` files. For example,
                    `sns_accel.proto`, `sns_proximity.proto` and
                    `sns_motion_detect.proto`.
- Platform sensor API definitions and documentation are present in the
                    `adsp_proc/qsh_platform/api/` directory. For example,
                    `sns_timer.proto`, `sns_interrupt.proto`, and
                    `sns_async_com_port.proto`.
- Framework-related APIs for SUID, registry, and diag are defined in the following
                proto files:
    - `sns_suid.proto`
    - `sns_registry.proto`
    - `sns_diag.proto`

Last Published: Jul 12, 2024

[Previous Topic
Features](https://docs.qualcomm.com/bundle/publicresource/80-70014-7/topics/supported_features.md) [Next Topic
Interfaces](https://docs.qualcomm.com/bundle/publicresource/80-70014-7/topics/qsh_api_reference.md)