The motion module is responsible for generating events related to movement. The movement can be detected using the motion sensor, but it can also be sourced from GPIO pins or simulated.
See the Overview: Firmware architecture for more information about the event-based communication in the nRF Desktop application and about how to read this table.
The motion module selects the source of movement based on the following configuration options:
CONFIG_DESKTOP_MOTION_NONE - Module is disabled.
CONFIG_DESKTOP_MOTION_SENSOR_PMW3360_ENABLE - Movement data is obtained from the gaming-grade
CONFIG_DESKTOP_MOTION_SENSOR_PAW3212_ENABLE - Movement data is obtained from
CONFIG_DESKTOP_MOTION_BUTTONS_ENABLE - Movement data is generated using buttons.
See the following sections for more information.
Depending on the selected configuration option, a different implementation file is used during the build process.
The motion sensor is sampled from the context of a dedicated thread. The option CONFIG_DESKTOP_MOTION_SENSOR_THREAD_STACK_SIZE is used to set the thread’s stack size.
The motion sensor default sensitivity and power saving switching times can be set with the following options:
CONFIG_DESKTOP_MOTION_SENSOR_CPI - Default CPI.
Sleep 1mode default switch time.
Sleep 2mode default switch time.
Sleep 3mode default switch time.
For more information, see the sensor documentation and the Kconfig help.
CONFIG_DESKTOP_MOTION_SIMULATED_ENABLE option adds the
src/hw_interface/motion_simulated.c file to the compilation.
If the shell is available (the
CONFIG_SHELL option is set), the motion module registers a shell module
motion_sim and links to it two commands:
If the shell is not available, motion generation starts automatically when the device is connected to USB or Bluetooth®.
When started, the module will generate simulated motion events. The movement data in each event will be tracing the predefined path, an eight-sided polygon.
You can configure the path with the following options:
CONFIG_DESKTOP_MOTION_SIMULATED_EDGE_TIME - Sets how long each edge is traced.
CONFIG_DESKTOP_MOTION_SIMULATED_SCALE_FACTOR - Scales the size of the polygon.
stop command will cause the module to stop generating new events.
In a configuration where either CONFIG_DESKTOP_MOTION_SENSOR_PMW3360_ENABLE or CONFIG_DESKTOP_MOTION_SENSOR_PAW3212_ENABLE is used, you can configure the module through the Configuration channel. In these configurations, the module is a configuration channel listener and it provides the following configuration options:
This is a special, read-only option used to provide information about the module variant. For the motion sensor, the module variant is a sensor model written in lowercase, for example
The HID configurator for nRF Desktop uses the sensor model to identify the descriptions of the configuration options. These descriptions are defined in the
The motion sensor CPI.
These firmware option names correspond to switch times of motion sensor modes, namely the sleep modes of
PAW3212and the rest modes of
PMW3360. These modes are used by a motion sensor to reduce the power consumption, but they also increase the sensor’s response time when a motion is detected after a period of inactivity.
The HID configurator for nRF Desktop refers to these mode options using names that depend on the sensor variant:
PAW3212, the mode options are called respectively:
PMW3360, the mode options are called respectively:
This section describes the motion module implementation for motion sensors.
The motion module samples movement data from the motion sensor using the motion sensor driver.
The name of the device linked with the driver changes depending on the selected sensor.
The same is true for the names of sensor configuration options.
The nRF Desktop application aggregates the sensor-specific information and translates them to the application abstracts in the
configuration/common/motion_sensor.h header file.
The motion module uses a dedicated sampling thread to sample data from the motion sensor. The reason for using the sampling thread is the long time required for data to be ready. Using a dedicated thread also simplifies the module because the interaction with the sensor becomes sequential. The sampling thread priority is set to 0 (the highest preemptive thread priority) because it is assumed that the data sampling happens in the background.
The sampling thread stays in the unready state blocked on a semaphore. The semaphore is triggered when the motion sensor trigger sends a notification that the data is available or when other application event requires the module interaction with the sensor (for example, when configuration is submitted from the host).
The motion module starts in
STATE_DISABLED and after initialization enters
When disconnected, the module is not generating motion events, but the motion sensor is sampled to make sure its registers are cleared.
Upon connection, the following happens:
The motion module switches to the
STATE_IDLEstate, in which the module waits for the motion sensor trigger.
When a first motion is detected and the device is connected to a host (meaning it can transmit the HID data out), the module completes the following actions:
Samples the motion data.
Waits for the indication that the
motion_eventdata was transmitted to the host. This is done when the module receives the
At that point, a next motion sampling is performed and the next
The module continues to sample data until disconnection or when there is no motion detected.
motion module assumes no motion when a number of consecutive samples equal to CONFIG_DESKTOP_MOTION_SENSOR_EMPTY_SAMPLES_COUNT returns zero on both axis.
In such case, the module will switch back to
STATE_IDLE and wait for the motion sensor trigger.