// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only

/*!
\group sensorgesture_plugins_topics
\title QtSensorGestures Plugins
\brief Explains how to develop recognizer plugins with QtSensorGestures

The QtSensorGestures recognizer plugins are the way to create your own
sensor gestures.

Creating software to recognize motion gestures using sensors is a huge subject not covered here.

The QSensorGesture API does not limit usage to any of the common classification methods of gesture
recognition, such as Hidden Markov Models, Neural Networks, Dynamic Time Warping, or even the
ad-hoc heuristic recognizers of Qt's built-in sensor gesture recognizers. It's basically a
signaling system for lower level gesture recogition methods and algorithms to communicate to the
higher level applications.

\tableofcontents

\section1 Overview

    The steps for creating a sensor gesture plugin are as follows:
\list
\li Sub-class from QSensorGesturePluginInterface
\li Sub-class from QSensorGestureRecognizer and implement gesture recognizer logic using QtSensors.
\li Create an instance of that recognizer in the derived QSensorGesturePluginInterface class, and call
 QSensorGestureManager::registerSensorGestureRecognizer(sRec); in your registerRecognizers()
function. QSensorGestureManager will retain ownership of the recognizer object.

This is the class in which the gesture recognizer system should be implemented from.

\endlist

\snippet sensorgestures/plugin.cpp Plugin


\section2 Recognizer Classes

If you are making sensorgestures available through the QtSensorGestures API, these are the
classes to subclass.

\annotatedlist sensorgestures_recognizer

\target Qt Sensor Gestures
\section3 Recognizer Plugins

The Sensor Gesture Recognizers that come with Qt are made using an ad-hoc heuristic approach.
The user cannot define their own gestures, and must learn how to perform and accommodate the
pre-defined gestures herein.

A developer may use any method, including computationally- and training-intensive well-
known classifiers, to produce gesture recognizers. There are currently no classes in Qt for
gesture training, nor is it possible for the user to define his own sensor-based motion gestures.

A procedure for writing ad-hoc recognizers might include:
\list
    \li Obtain and gather output from the accelerometer through \c QAccelerometerReading of a gesture being performed.
    \li Use various methods and constraints on the accelerometer data to recognize the various states:
    \list i
        \li Initial "listening" state for a gesture
        \li Start of a possible gesture, moving into a "detecting" state
        \li End of a possible gesture, moving into a "recognizing" state
        \li and finally, if it is recognized, the "recognized" state, or if not recognized, move back to
           the "listening" state.
    \endlist
    \li Test procedure to make sure it is easy to perform, and will not
 produce too many false positive recognitions, or collisions if used with other gestures. Meaning
that gestures performed get recognized as another gesture instead.

\endlist

Below you will find a list of included plugins and their signals.

For the ShakeGestures plugin:
    \table
        \row
            \li Recognizer Id
            \li Signals
        \row
            \li QtSensors.shake
            \li shake
\endtable

For the QtSensorGestures plugin:
    \table
        \row
            \li Recognizer Id
            \li Signals
            \li Description
            \li Images
        \row
            \li QtSensors.cover
            \li cover
            \li Hand covers up phone display for one second, when it's face up, using the Proximity and Orientation sensors.
            \li \image sensorgesture-cover.png
        \row
            \li QtSensors.doubletap
            \li doubletap
            \li Double tap of finger on phone, using the DoubleTap sensor.
            \li \image sensorgesture-doubletap.png
        \row
            \li QtSensors.hover
            \li hover
            \li Hand hovers about 4 cm above the phone for more than 1 second, then is removed when face up,
               using the IR Proximity sensor.
            \li \image sensorgesture-hover.png
        \row
            \li QtSensors.pickup
            \li pickup
            \li Phone is resting face up on a flat curface, and is then picked up and brought up into viewing position. Uses the Accelerometer sensor.
            \li \image sensorgesture-faceup.png
        \row
            \li QtSensors.shake2
            \li shakeLeft, shakeRight, shakeUp, shakeDown
            \li Shake phone in a certain direction, using the Accelerometer sensor.
            \li \image sensorgesture-shake.png
        \row
            \li QtSensors.slam
            \li slam
            \li Phone is held in a top up position with a side facing forward for a moment. Swing it quickly with a downward motion
             like it is being used to point at something with the top corner. Uses the Accelerometer and Orientation sensors.
            \li \image sensorgesture-slam_1.png
            \image sensorgesture-slam_2.png
        \row
            \li QtSensors.turnover
            \li turnover
            \li Phone is turned face down and placed on a surface, using Proximity and Orientation sensors.
            \li \image sensorgesture-facedown.png
        \row
            \li QtSensors.twist
            \li twistLeft, twistRight
            \li Phone is held face up and then twisted left or right (left side up or right side up) and back, using the Accelerometer and Orientation sensors.
            \li \image sensorgesture-twist.png
        \row
            \li QtSensors.whip
            \li whip
            \li Move phone quickly down and then back up. Uses the Accelerometer and Orientation sensors.
            \li \image sensorgesture-whip.png
   \endtable

*/
