Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++ #include "qrotationsensor.h"
++ #include "qrotationsensor_p.h"
++
++ QT_BEGIN_NAMESPACE
++
++ IMPLEMENT_READING(QRotationReading)
++
++ /*!
++ \class QRotationReading
++ \ingroup sensors_reading
++ \inmodule QtSensors
++ \since 5.1
++
++ \brief The QRotationReading class represents one reading from the
++ rotation sensor.
++
++ \section1 QRotationReading Units
++
++ The rotation reading contains 3 angles, measured in degrees that define
++ the orientation of the device in three-dimensional space. These angles
++ are similar to yaw, pitch and roll but are defined using only right hand
++ rotation with axes as defined by the right hand cartesian coordinate system.
++
++ \image sensors-rotation.jpg
++ {Device rotated relative to the x, y, and z axes, with the rotated
++ y2 and y1 axes and the rotation angle marked}
++
++ The three angles are applied to the device in the following order.
++
++ \list
++ \li Right-handed rotation z (-180, 180]. Starting from the y-axis and
++ incrementing in the counter-clockwise direction.
++ \li Right-handed rotation x [-90, 90]. Starting from the new
++ (once-rotated) y-axis and incrementing towards the z-axis.
++ \li Right-handed rotation y (-180, 180]. Starting from the new
++ (twice-rotated) z-axis and incrementing towards the x-axis.
++ \endlist
++
++ Here is a visualization showing the order in which angles are applied.
++
++ \image sensors-rotation-anim.gif
++ {Animation showing the device rotated around the z, x, and then y
++ axes in sequence}
++
++ The 0 point for the z angle is defined as a fixed, external entity and
++ is device-specific. While magnetic North is typically used as this
++ reference point it may not be. Do not attempt to compare values
++ for the z angle between devices or even on the same device if it has
++ moved a significant distance.
++
++ If the device cannot detect a fixed, external entity the z angle will
++ always be 0 and the QRotationSensor::hasZ property will be set to false.
++
++ The 0 point for the x and y angles are defined as when the x and y axes
++ of the device are oriented towards the horizon. Here is an example of
++ how the x value will change with device movement.
++
++ \image sensors-rotation2.jpg
++ {Device shown in side profile tilting through x angles of 30, 15,
++ 0, -15, and -30 degrees}
++
++ Here is an example of how the y value will change with device movement.
++
++ \image sensors-rotation3.jpg
++ {Device shown end-on tilting through y angles of -30, -15, 0, 15,
++ and 30 degrees}
++
++ Note that when x is 90 or -90, values for z and y achieve rotation around
++ the same axis (due to the order of operations). In this case the y
++ rotation will be 0.
++ */
++
++ /*!
++ \property QRotationReading::x
++ \brief the rotation around the x axis.
++
++ Measured as degrees.
++ \sa {QRotationReading Units}
++ */
++
++ qreal QRotationReading::x() const
++ {
++ return d->x;
++ }
++
++ /*!
++ \property QRotationReading::y
++ \brief the rotation around the y axis.
++
++ Measured as degrees.
++ \sa {QRotationReading Units}
++ */
++
++ qreal QRotationReading::y() const
++ {
++ return d->y;
++ }
++
++ /*!
++ \property QRotationReading::z
++ \brief the rotation around the z axis.
++
++ Measured as degrees.
++ \sa {QRotationReading Units}
++ */
++
++ qreal QRotationReading::z() const
++ {
++ return d->z;
++ }
++
++ /*!
++ \brief Sets the rotation from three euler angles.
++
++ This is to be called from the backend.
++
++ The angles are measured in degrees. The order of the rotations matters, as first the \a z rotation
++ is applied, then the \a x rotation and finally the \a y rotation.
++
++ \since 5.0
++ */
++ void QRotationReading::setFromEuler(qreal x, qreal y, qreal z)
++ {
++ d->x = x;
++ d->y = y;
++ d->z = z;
++ }
++
++ // =====================================================================
++
++ /*!
++ \class QRotationFilter
++ \ingroup sensors_filter
++ \inmodule QtSensors
++ \since 5.1
++
++ \brief The QRotationFilter class is a convenience wrapper around QSensorFilter.
++
++ The only difference is that the filter() method features a pointer to QRotationReading
++ instead of QSensorReading.
++ */
++
++ /*!
++ \fn QRotationFilter::filter(QRotationReading *reading)
++
++ Called when \a reading changes. Returns false to prevent the reading from propagating.
++
++ \sa QSensorFilter::filter()
++ */
++
++ bool QRotationFilter::filter(QSensorReading *reading)
++ {
++ return filter(static_cast<QRotationReading*>(reading));
++ }
++
++ char const * const QRotationSensor::sensorType("QRotationSensor");
++
++ /*!
++ \class QRotationSensor
++ \ingroup sensors_type
++ \inmodule QtSensors
++ \since 5.1
++
++ \brief The QRotationSensor class is a convenience wrapper around QSensor.
++
++ The only behavioural difference is that this class sets the type properly.
++
++ This class also features a reading() function that returns a QRotationReading instead of a QSensorReading.
++
++ For details about how the sensor works, see \l QRotationReading.
++
++ \sa QRotationReading
++ */
++
++ /*!
++ Construct the sensor as a child of \a parent.
++ */
++ QRotationSensor::QRotationSensor(QObject *parent)
++ : QSensor(QRotationSensor::sensorType, *new QRotationSensorPrivate, parent)
++ {
++ }
++
++ /*!
++ Destroy the sensor. Stops the sensor if it has not already been stopped.
++ */
++ QRotationSensor::~QRotationSensor()
++ {
++ }
++
++ /*!
++ \fn QRotationSensor::reading() const
++
++ Returns the reading class for this sensor.
++
++ \sa QSensor::reading()
++ */
++
++ QRotationReading *QRotationSensor::reading() const
++ {
++ return static_cast<QRotationReading*>(QSensor::reading());
++ }
++
++ /*!
++ \property QRotationSensor::hasZ
++ \brief a value indicating if the z angle is available.
++
++ Returns true if z is available.
++ Returns false if z is not available.
++ */
++
++ bool QRotationSensor::hasZ() const
++ {
++ Q_D(const QRotationSensor);
++ return (d->hasZ);
++ }
++
++ /*!
++ \since 5.1
++
++ Sets whether the z angle is available to \a hasZ. This is to be called from the
++ backend. By default the hasZ property is true, so a backend only has to
++ call this if its rotation sensor can not report z angles.
++ */
++ void QRotationSensor::setHasZ(bool hasZ)
++ {
++ Q_D(QRotationSensor);
++ if (d->hasZ != hasZ) {
++ d->hasZ = hasZ;
++ emit hasZChanged(hasZ);
++ }
++ }
++
++ QT_END_NAMESPACE
++
++ #include "moc_qrotationsensor.cpp"