# Tools

The following tools are supported for functional testing and build
environment setup.

## Sensor functional test tools

The sensor info test, driver acceptance test, and sensor workhorse are
designed to facilitate comprehensive testing of the sensor
functionalities.

- The sensor info test provides detailed information about the sensor.
- The driver acceptance test ensures that the sensor drivers are
functioning correctly and are compatible with the QSH.
- The sensor workhorse is a tool to stress-test the sensors under
various conditions.

The test tools ensure the accuracy, reliability, and optimal performance
of both the hardware-based and software-based sensors in your
applications. The following sections provide information on the test
tools.

### Sensor info test (ssc\_sensor\_info)

#### Sensor info test definition

The sensor info test `ssc_sensor_info` is an application within the
QSH test suite. It lists the QSH supported sensors and their attributes.
You can query the attributes of a given data type.

ssc_sensor_info [-sensor=<sensor_type>] [-delay=<time_in_seconds>][-duration=<time_in_seconds>][-default_only=<1|0>][-log=<1|0>][-help]
    Copy to clipboard

Table : Parameters of ssc_sensor_info

| **Flags** | **Type** | **Value** | **Units** | Notes |
| --- | --- | --- | --- | --- |
| Sensor | `string` | Any valid sensor type, such as *accel* and *gyro*. | NA | Queries the attribute information for a specified sensor type. |
| Log | `int` | 0 | 1 | – | Enables or disables diagnostic (API) logs. |
| help(h) | `int` | – | – | Displays command usage help. |
| Duration | `int` | Positive values | seconds | Specifies the wait time for the sensor attribute updates. |
| Delay | `int` | Positive values | seconds | Specifies the time delay before sending the sensor requests. |
| default\_only | `int` | 0 | 1 | – | If the `default_only` flag is set to false, UIDs of all the available sensors that support the specified data type is sent. If the `default_only` flag is set to true, only the UID of the default sensor availability is sent. |

**Sensor info test examples**

- Query the sensor attributes and generate diagnostic logs.

ssc_sensor_info
        Copy to clipboard

root@qcm6490:~# ssc_sensor_info
        ssc_sensor_info v1.86
        
        SUID           = 0xebd5604d09d379bca54dcf30ec041e0f
        NAME           = ak0991x
        VENDOR         = akm
        TYPE           = mag
        AVAILABLE      = true
        VERSION        = 2.62.47
        API            = sns_mag.proto
        RATES          = [1.000000, 10.000000, 20.000000, 50.000000, 100.000000]
        RESOLUTIONS    = 0.150000
        RANGES         = [-4912.000000,4912.000000]
        DRI            = false
        FIFO_SIZE      = 0
        STREAM_TYPE    = streaming
        STREAM_SYNC    = false
        DYNAMIC        = false
        EVENT_SIZE     = 16
        OP_MODES       = [LOW_POWER, LOW_NOISE]
        ACTIVE_CURRENT = 900
        SLEEP_CURRENT  = 3
        HW_ID          = 0
        RIGID_BODY     = display
        PHYSICAL_SENSOR       = true
        PHYSICAL_SENSOR_TESTS = [3, 1]
        SELECTED_RESOLUTION   = 0.150000
        SELECTED_RANGE        = [-4912.000000,4912.000000]
        
        SUID           = 0xaddeaddeaddeaddeaddeaddeaddeadde
        NAME           = da_test
        VENDOR         = QTI
        TYPE           = da_test
        AVAILABLE      = true
        VERSION        = 0.51.0
        API            = sns_da_test.proto
        STREAM_TYPE    = on_change
        
        SUID           = 0x69def905fea2fbac6a43ca273221a2eb
        NAME           = aont
        VENDOR         = QTI
        TYPE           = aont
        AVAILABLE      = true
        VERSION        = 0.0.1
        API            = sns_aont.proto
        STREAM_TYPE    = on_change
        
        SUID           = 0xabababababababababababababababab
        NAME           = suid
        VENDOR         = QTI
        TYPE           = suid
        AVAILABLE      = true
        VERSION        = 0.0.1
        API            = sns_suid.proto
        STREAM_TYPE    = single_output
        
        SUID           = 0xe12754a7007f27595e2541b4701e2275
        NAME           = registry
        VENDOR         = QTI
        TYPE           = registry
        AVAILABLE      = true
        VERSION        = 0.0.1
        API            = sns_registry.proto
        STREAM_TYPE    = single_output
        
        SUID           = 0xadfeadfeadfeadfeadfeadfeadfeadfe
        NAME           = da_test_big_image
        VENDOR         = QTI
        TYPE           = da_test
        AVAILABLE      = true
        VERSION        = 0.49.0
        API            = sns_da_test.proto
        STREAM_TYPE    = on_change
        
        SUID           = 0x61ab5376b4a5c9aa58442ede47acd316
        NAME           = icm4x6xx
        VENDOR         = TDK-Invensense
        TYPE           = accel
        AVAILABLE      = true
        VERSION        = 1.65.2
        API            = sns_accel.proto
        RATES          = [12.500000, 25.000000, 50.000000, 100.000000, 200.000000, 500.000000]
        RESOLUTIONS    = [0.000019, 0.000037, 0.000075, 0.000150, 0.000299]
        RANGES         = [[-9.806650,9.806650], [-19.613300,19.613300], [-39.226601,39.226601], [-78.453201,78.453201], [-156.906403,156.906403]]
        DRI            = true
        FIFO_SIZE      = 200
        STREAM_TYPE    = streaming
        STREAM_SYNC    = false
        DYNAMIC        = false
        EVENT_SIZE     = 16
        OP_MODES       = [LPM, NORMAL, HIGH_PERF]
        ACTIVE_CURRENT = [50, 240, 240]
        SLEEP_CURRENT  = 6
        HW_ID          = 0
        RIGID_BODY     = display
        PHYSICAL_SENSOR       = true
        PHYSICAL_SENSOR_TESTS = [3, 2, 1]
        SELECTED_RESOLUTION   = 0.000299
        SELECTED_RANGE        = [-156.906403,156.906403]
        LOW_LATENCY_RATES     = 1000.000000
        PASSIVE_REQUEST       = true
        Copy to clipboard
- Query all *accel* sensor attributes

ssc_sensor_info -sensor=accel
        Copy to clipboard

root@qcm6490:~# ssc_sensor_info -sensor=accel
        ssc_sensor_info v1.86
        
        SUID           = 0x61ab5376b4a5c9aa58442ede47acd316
        NAME           = icm4x6xx
        VENDOR         = TDK-Invensense
        TYPE           = accel
        AVAILABLE      = true
        VERSION        = 1.65.2
        API            = sns_accel.proto
        RATES          = [12.500000, 25.000000, 50.000000, 100.000000, 200.000000, 500.000000]
        RESOLUTIONS    = [0.000019, 0.000037, 0.000075, 0.000150, 0.000299]
        RANGES         = [[-9.806650,9.806650], [-19.613300,19.613300], [-39.226601,39.226601], [-78.453201,78.453201], [-156.906403,156.906403]]
        DRI            = true
        FIFO_SIZE      = 80
        STREAM_TYPE    = streaming
        STREAM_SYNC    = false
        DYNAMIC        = false
        EVENT_SIZE     = 16
        OP_MODES       = [LPM, NORMAL, HIGH_PERF]
        ACTIVE_CURRENT = [50, 240, 240]
        SLEEP_CURRENT  = 6
        HW_ID          = 0
        RIGID_BODY     = display
        PHYSICAL_SENSOR       = true
        PHYSICAL_SENSOR_TESTS = [3, 2, 1]
        SELECTED_RESOLUTION   = 0.000299
        SELECTED_RANGE        = [-156.906403,156.906403]
        LOW_LATENCY_RATES     = [1000.000000, 2000.000000]
        PASSIVE_REQUEST       = true
        Copy to clipboard

**Test application output**

The test application generates the following output:

- Standard output on console
- Result file

### Driver acceptance test (ssc\_drva\_test)

#### Driver acceptance test definition

The driver acceptance test tool, `ssc_drva_test`, is used for the
sensor driver validation and operates at the QSH sensor API layer. It
executes a range of sensor use cases. The tool accepts the parameters
directly from the command line and eliminates the need for compile-time
options. This approach makes it a convenient and efficient tool to
perform basic driver-level tests or validations.

ssc_drva_test [-sensor=<sensor_type>] [-duration=<time_in_seconds>] [-sample_rate=<value_in_Hz>] [-batch_period=<value_in_seconds>] [-iterations=<value>] [-num_samples=<value>] [-factory_test=<value>]
    Copy to clipboard

Table : Parameters of ssc_drva_test

| **Flag** | **Type** | **Value** | **Unit** | **Notes** |
| --- | --- | --- | --- | --- |
| `sensor` | `string` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">accel</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">gyro</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">sensor_temperature</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">pressure</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">mag</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">humidity</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">ambient_temperature</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">ultra_violet</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">proximity</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">ambient_light</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">rgb</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">hall</span></code></p></li><br><li><p>Any custom sensor added</p></li><br></ul> | – | Mandatory argument: limited to the available sensor types. |
| `duration` | `float` | Positive values only | Sec | Mandatory argument: sensor test duration in seconds. |
| `sample_rate` | `float` | Positive floating point number values:<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>-1: Maximum sampling rate</p></li><br>> <li><p>-2: Minimum sampling rate</p></li><br>> </ul> | Hz | Mandatory for streaming sensors, optional for on-change sensors. |
| `batch_period` | `float` | Positive floating point numbers | Sec | This period is the same as the report period and indicates how long to buffer the samples and report outside of the low-power processor. |
| `iterations` | `int` | Positive values only | NA | Provides the number of times the test must be repeated. |
| `num_samples` | `int` | Positive values only | NA | Indicates the minimum number of samples intended to be collected. If a `num_samples` parameter is specified and the test does not collect enough samples during the test, the test sensor generates FAIL.<br><br><br>The `num_samples` parameter forces the test to run for a maximum duration between a specified duration or duration calculated by the following:<br><ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">num_samples*</span></code> expected sample rate, where the expected sample rate is the rate at which the sensor is expected to serve.</p></li><br></ul> |
| `factory_test` | `int` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">0</span> <span class="pre">(SNS_PHYSICAL_SENSOR_TEST_TYPE_SW)</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">1</span> <span class="pre">(SNS_PHYSICAL_SENSOR_TEST_TYPE_HW)</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">2</span> <span class="pre">(SNS_PHYSICAL_SENSOR_TEST_TYPE_FACTORY)</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">3</span> <span class="pre">(SNS_PHYSICAL_SENSOR_TEST_TYPE_COM)</span></code></p></li><br></ul> | NA | Selects the type of factory test (from the value column) that you want to run. |

**Driver acceptance test examples**

- Stream a single sensor at a selected sampling frequency for a known
duration:

ssc_drva_test -sensor=accel -duration=5 -sample_rate=500
        Copy to clipboard

root@qcm6490:~# ssc_drva_test -sensor=accel -duration=5 -sample_rate=500
        6 ssc_drva_test version 1.27k
        6 ssc_drva_test -sensor=accel -duration=5 -sample_rate=500
        diag: Diag_LSM_Init: invoked for pid: 1141 with init_count: 0
        diag:successfully connected to socket 3
        diag: Diag_LSM_Init: done for pid: 1141 with init_count: 1
        6 event_cb attribute event for da_test
        6 event_cb attribute event for da_test
        6 using da_test name=da_test, suid = [high addeaddeaddeadde, low addeaddeaddeadde
        6 enter send_memory_log_req cookie: 6
        6 exit send_memory_log_req
        6 enter da_test runner. -rumifact=1
        6 -time_to_first_event=233206
        6 -time_to_last_event=-20008
        6 -sample_ts=50267544823
        6 -total_samples=2528
        6 -avg_delta=37875
        6 -recvd_phy_config_sample_rate=500
        6 -random_seed_used=2926886043
        6 -num_request_sent=2
        6 -first_sample_timestamp=50171775915
        6 received event: PASS
        6 enter send_memory_log_req cookie: 6
        6 exit send_memory_log_req
        6 PASS
        Copy to clipboard
- Batch a single sensor at a selected sampling frequency and report
period for a known duration:

ssc_drva_test -sensor=accel -duration=30.0 -sample_rate=100 -batch_period=2.0
        Copy to clipboard

root@qcm6490:~# ssc_drva_test -sensor=accel -duration=30.0 -sample_rate=100 -batch_period=2.0
        3 ssc_drva_test version 1.27k
        3 ssc_drva_test -sensor=accel -duration=30.0 -sample_rate=100 -batch_period=2.0
        diag: Diag_LSM_Init: invoked for pid: 1413 with init_count: 0
        diag:successfully connected to socket 3
        diag: Diag_LSM_Init: done for pid: 1413 with init_count: 1
        3 event_cb attribute event for da_test
        3 event_cb attribute event for da_test
        3 using da_test name=da_test, suid = [high addeaddeaddeadde, low addeaddeaddeadde
        3 enter send_memory_log_req cookie: 3
        3 exit send_memory_log_req
        3 enter da_test runner. -rumifact=1
        3 -time_to_first_event=15321140
        3 -time_to_last_event=-13606286
        3 -sample_ts=8591389823
        3 -total_samples=2960
        3 -avg_delta=184826
        3 -recvd_phy_config_sample_rate=100.000000
        3 -random_seed_used=3720387971
        3 -num_request_sent=2
        3 -first_sample_timestamp=8030694123
        3 received event: PASS
        3 enter send_memory_log_req cookie: 3
        3 exit send_memory_log_req
        3 PASS
        Copy to clipboard
- Self-test for accelerometer (hardware self-test):

ssc_drva_test -sensor=accel -factory_test=1 -duration=10
        Copy to clipboard

root@qcm6490:~# ssc_drva_test -sensor=accel -factory_test=1 -duration=10
        4 ssc_drva_test version 1.27k
        4 ssc_drva_test -sensor=accel -factory_test=1 -duration=10
        diag: Diag_LSM_Init: invoked for pid: 1439 with init_count: 0
        diag:successfully connected to socket 3
        diag: Diag_LSM_Init: done for pid: 1439 with init_count: 1
        4 event_cb attribute event for da_test
        4 event_cb attribute event for da_test
        4 using da_test name=da_test, suid = [high addeaddeaddeadde, low addeaddeaddeadde
        4 enter send_memory_log_req cookie: 4
        4 exit send_memory_log_req
        4 enter da_test runner. -rumifact=1
        4 -time_to_first_event=0
        4 -time_to_last_event=-2032137957
        4 -sample_ts=10622073335
        4 -total_samples=0
        4 -avg_delta=0
        4 -recvd_phy_config_sample_rate=0.000000
        4 -random_seed_used=1840104635
        4 -num_request_sent=2
        4 -first_sample_timestamp=0
        4 received event: PASS
        4 enter send_memory_log_req cookie: 4
        4 exit send_memory_log_req
        4 PASS
        Copy to clipboard

**Output**:

On the console command line, this test only outputs as pass or fail,
which indicates only the test execution status (whether the test is
complete).

### Sensor workhorse (see\_workhorse)

#### Sensor workhorse definition

The sensor workhorse tool, `see_workhorse`, operates specific sensors
based on the command-line arguments. It is designed to streamline sensor
testing and data collection in various configurations.

see_workhorse [-sensor=<sensor_type>][-sample_rate=<min | max | number>] [-batch_period=<seconds>] [-calibrated=<0 | 1>] [-wakeup=<0 | 1>]
    Copy to clipboard

Table : Parameters of see_workhorse

| Flags | Type | Value range | Units | Notes |
| --- | --- | --- | --- | --- |
| `sensor` | `string` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">accel</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">gyro</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">sensor_temperature</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">pressure</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">mag</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">humidity</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">ambient_temperature</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">ultra_violet</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">proximity</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">ambient_light</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">rgb</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">hall</span></code></p></li><br><li><p>Any custom sensor added</p></li><br></ul> | NA | Mandatory argument: Limited to the available sensor types. |
| `on_change` | `int` | 0 | 1 | NA | <ul class="simple"><br><li><p>0 selects using <code class="docutils literal notranslate"><span class="pre">SNS_STD_SENSOR_STREAM_TYPE_STREAMING</span></code>.</p></li><br><li><p>1 selects using <code class="docutils literal notranslate"><span class="pre">SNS_STD_SENSOR_STREAM_TYPE_ON_CHANGE</span></code>.</p></li><br></ul> |
| `sample_rate` | `float` | Positive floating point number values:<br><ul class="simple"><br><li><p>-1: Maximum sampling rate</p></li><br><li><p>-2: Minimum sampling rate</p></li><br></ul> | Hz | Mandatory for streaming sensors, optional for on-change sensors. |
| `batch_period` | `float` | Positive floating point numbers | Seconds | Same as the batch period or report period. |
| `calibrated` | `int` | 0 | 1 | NA | <ul class="simple"><br><li><p>0: nop (default).</p></li><br><li><p>1: if the <code class="docutils literal notranslate"><span class="pre">sensor_type</span></code> is gyro or mag, then also activate <code class="docutils literal notranslate"><span class="pre">gyro_cal</span></code> or <code class="docutils literal notranslate"><span class="pre">/mag_cal</span></code>, respectively.</p></li><br></ul> |
| `wakeup` | `int` | 0 | 1 | NA | <ul class="simple"><br><li><p>0: sets <code class="docutils literal notranslate"><span class="pre">suspend_config</span></code> wake-up to <code class="docutils literal notranslate"><span class="pre">SEE_CLIENT_DELIVERY_NO_WAKEUP</span></code>.</p></li><br><li><p>1: sets <code class="docutils literal notranslate"><span class="pre">suspend_config</span></code> wake-up to <code class="docutils literal notranslate"><span class="pre">SEE_CLIENT_DELIVERY_WAKEUP</span></code> (default).</p></li><br></ul> |
| `display_events` | `int` | 0 | 1 | NA | Display sensor events in JSON format, using the event callbacks. |

**Sensor workhorse examples**

For instance, use the following command to stream the accelerometer data
at the maximum rate for 30 sec:

see_workhorse -sensor=accel -sample_rate=max -duration=30 -display_events=1
    Copy to clipboard

root@qcm6490:~# see_workhorse -sensor=accel -sample_rate=max -duration=30 -display_events=1
    see_workhorse version 2.04
    20:22:15.406 see_workhorse -sensor=accel -sample_rate=max -duration=30 -display_events=1
    begin usta_get_sensor_list
    Copy to clipboard

This command instructs `see_workhorse` to run the accelerometer
`accel`, at a maximum sample rate for a duration of 30 sec.

20:22:15.731 stream_sensor( accel)
    20:22:15.731 + sample_rate: 500.000000 hz
    20:22:15.838 config_stream_sensor() complete rc 0
    20:22:15.838 sleep(30) seconds
    
    "sns_client_event_msg" : {
     "suid" : {
      "suid_low" : "0x58442ede47acd316",
      "suid_high" : "0x61ab5376b4a5c9aa"
     },
     "events" : [
      {
       "msg_id" : 768,
       "timestamp" : 78497742089,
       "payload" : {
        "sample_rate" : 500.000000,
        "water_mark" : 1,
    Copy to clipboard

## Miscellaneous tools

The following are the tools for the build environment and functional
diagnosing:

- **Qualcomm® Hexagon™ DSP toolchain**

    Hexagon 8.4.07 toolchain
- **QXDM Professional tool**

    The Qualcomm® eXtensible diagnostic monitor (QXDM) Professional™ tool
is a diagnostic client.

    - The QSH framework can call the macros and APIs directly to send
the debug information to print strings and log packets.
    - The QXDM logs are primarily used for the aDSP side debugging. For
more information, see
[Debug](https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/debugging.html)
in [Qualcomm Linux Sensors Guide -
Addendum](https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/overview.html).

Note

[Qualcomm Linux Sensors Guide -  Addendum](https://docs.qualcomm.com/bundle/resource/topics/80-70017-7A/overview.html) is accessible only to the licensed users.
    - The QXDM Professional Tool requires a USB connection. The
application processors have a direct connectivity to a USB port,
but the aDSP does not.

Last Published: Dec 24, 2024

[Previous Topic
Samples](https://docs.qualcomm.com/bundle/publicresource/80-70017-7/topics/samples.md) [Next Topic
Calibrate](https://docs.qualcomm.com/bundle/publicresource/80-70017-7/topics/calibrate.md)