[-]
[+]
|
Changed |
_service:tar_git:qt5-feedback-haptics-droid-vibrator.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-feedback-haptics-droid-vibrator.spec
^
|
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-feedback-haptics-droid-vibrator-0.0.7.tar.bz2/droid-vibrator-device.ini.example
^
|
(renamed from droid-vibrator.ini)
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-feedback-haptics-droid-vibrator-0.0.7.tar.bz2/droid-vibrator.json
^
|
@@ -1 +1 @@
-{ "Interfaces": [ "QFeedbackThemeInterface" ] }
+{ "Interfaces": [ "QFeedbackHapticsInterface", "QFeedbackThemeInterface" ] }
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-feedback-haptics-droid-vibrator-0.0.7.tar.bz2/droid-vibrator.pro
^
|
@@ -8,14 +8,11 @@
HEADERS += qfeedback.h
SOURCES += qfeedback.cpp
+OTHER_FILES += droid-vibrator.json
CONFIG += link_pkgconfig
PKGCONFIG += android-headers libhardware libvibrator
-DEFINES += 'DROID_VIBRATOR_SETTINGS=\'\"$$[QT_INSTALL_PLUGINS]/feedback/droid-vibrator.ini\"\''
-
-settings.files = droid-vibrator.ini
-settings.path = $$[QT_INSTALL_PLUGINS]/feedback
-INSTALLS += settings
+DEFINES += 'DROID_VIBRATOR_SETTINGS=\'\"$$[QT_INSTALL_PLUGINS]/feedback/droid-vibrator-device.ini\"\''
target.path = $$[QT_INSTALL_PLUGINS]/feedback
INSTALLS += target
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-feedback-haptics-droid-vibrator-0.0.7.tar.bz2/qfeedback.cpp
^
|
@@ -47,30 +47,37 @@
#include <QtCore/QFile>
#include <QtCore/QSettings>
+#include <QtCore/QLoggingCategory>
-#include <hardware_legacy/vibrator.h>
-
-// Uncomment the following line for debug info
-//#define DROID_VIBRATOR_DEBUG
-
-#define DROID_VIBRATOR_TAG "qtfeedback-droid-vibrator: "
-
-#if defined(DROID_VIBRATOR_DEBUG)
-# define PLUGIN_DEBUG(fmt, ...) qDebug(DROID_VIBRATOR_TAG fmt, ##__VA_ARGS__)
-#else
-# define PLUGIN_DEBUG(fmt, ...)
-#endif
-
+Q_LOGGING_CATEGORY(qtFeedbackDroidVibrator, "qt.Feedback.DroidVibrator")
QFeedbackDroidVibrator::QFeedbackDroidVibrator(QObject *parent)
: QObject(parent)
+ , QFeedbackHapticsInterface()
, QFeedbackThemeInterface()
, m_profile(this)
, m_profileEnablesVibra(false)
, m_profileTouchscreenVibraLevel(0)
, m_durations()
+ , m_actuator(createFeedbackActuator(this, 2))
+ , m_activeEffect(Q_NULLPTR)
+ , m_actuatorEnabled(true)
+#if ANDROID_VERSION_MAJOR >= 7
+ , m_dev(NULL)
+#endif
{
- PLUGIN_DEBUG("Initializing plugin");
+ qCDebug(qtFeedbackDroidVibrator) << "Initializing plugin";
+
+#if (ANDROID_VERSION_MAJOR >= 7)
+ struct hw_module_t *hwmod;
+
+ hw_get_module(VIBRATOR_HARDWARE_MODULE_ID, (const hw_module_t **)(&hwmod));
+ Q_ASSERT(hwmod != NULL);
+
+ if (vibrator_open(hwmod, &m_dev) < 0) {
+ qCCritical(qtFeedbackDroidVibrator) << "Unable to open vibrator device";
+ }
+#endif
// Defaults
m_durations[QFeedbackEffect::Press] = 20;
@@ -93,7 +100,7 @@
#define READ_SETTING(x) \
m_durations[QFeedbackEffect::x] = \
settings.value(#x, m_durations[QFeedbackEffect::x]).value<int>(); \
- PLUGIN_DEBUG("Reading setting for %s: %d", #x, m_durations[QFeedbackEffect::x]);
+ qCDebug(qtFeedbackDroidVibrator) << "Reading setting for" << #x << ":" << m_durations[QFeedbackEffect::x];
READ_SETTING(Press)
READ_SETTING(Release)
@@ -111,7 +118,7 @@
#undef READ_SETTING
} else {
- PLUGIN_DEBUG("Not loading settings (%s does not exist)", DROID_VIBRATOR_SETTINGS);
+ qCDebug(qtFeedbackDroidVibrator) << "Not loading settings (" << DROID_VIBRATOR_SETTINGS << "does not exist)";
}
connect(&m_profile, SIGNAL(activeProfileChanged(QString)),
@@ -126,7 +133,7 @@
QFeedbackDroidVibrator::~QFeedbackDroidVibrator()
{
- PLUGIN_DEBUG("Deinitializing plugin");
+ qCDebug(qtFeedbackDroidVibrator) << "Deinitializing plugin";
}
void QFeedbackDroidVibrator::deviceProfileSettingsChanged()
@@ -135,16 +142,16 @@
m_profileEnablesVibra = m_profile.isVibrationEnabled(profile);
m_profileTouchscreenVibraLevel = m_profile.touchscreenVibrationLevel(profile);
- PLUGIN_DEBUG("Profile settings changed: enabled=%s, level=%d",
- m_profileEnablesVibra ? "true" : "false",
- m_profileTouchscreenVibraLevel);
+ qCDebug(qtFeedbackDroidVibrator) << "Profile settings changed: enabled:"
+ << m_profileEnablesVibra
+ << "level:" << m_profileTouchscreenVibraLevel;
}
bool QFeedbackDroidVibrator::play(QFeedbackEffect::Effect effect)
{
// If vibra is disabled, disable effects
if (Q_UNLIKELY(!m_profileEnablesVibra)) {
- PLUGIN_DEBUG("Not playing effect (vibra disabled)");
+ qCDebug(qtFeedbackDroidVibrator) << "Not playing effect (vibra disabled)";
return false;
}
@@ -153,7 +160,7 @@
switch (effect) {
case QFeedbackEffect::PressWeak:
case QFeedbackEffect::ReleaseWeak:
- PLUGIN_DEBUG("Not playing effect (vibra level setting)");
+ qCDebug(qtFeedbackDroidVibrator) << "Not playing effect (vibra level setting)";
return false;
default:
break;
@@ -174,11 +181,16 @@
case QFeedbackEffect::Appear:
case QFeedbackEffect::Disappear:
case QFeedbackEffect::Move:
- PLUGIN_DEBUG("Playing effect #%d (%d ms)", effect, m_durations[effect]);
+ qCDebug(qtFeedbackDroidVibrator) << "Playing effect #" << effect << "(" << m_durations[effect] << "ms)";
+#if ANDROID_VERSION_MAJOR >= 7
+ if (m_dev)
+ m_dev->vibrator_on(m_dev, m_durations[effect]);
+#else
vibrator_on(m_durations[effect]);
+#endif
return true;
default:
- PLUGIN_DEBUG("Unknown or undefined effect #%d", effect);
+ qCDebug(qtFeedbackDroidVibrator) << "Unknown or undefined effect #" << effect;
break;
}
@@ -189,3 +201,114 @@
{
return QFeedbackInterface::PluginLowPriority;
}
+
+QList<QFeedbackActuator*> QFeedbackDroidVibrator::actuators()
+{
+ return QList<QFeedbackActuator*>() << m_actuator;
+}
+
+void QFeedbackDroidVibrator::setActuatorProperty(const QFeedbackActuator &, ActuatorProperty prop, const QVariant &value)
+{
+ switch (prop) {
+ case Enabled: {
+ bool old = m_actuatorEnabled;
+ m_actuatorEnabled = value.toBool();
+ if (old != m_actuatorEnabled && !m_actuatorEnabled && m_activeEffect) {
+ setEffectState(m_activeEffect, QFeedbackEffect::Stopped);
+ m_activeEffect = 0;
+ }
+ break;
+ }
+ default: break;
+ }
+}
+
+QVariant QFeedbackDroidVibrator::actuatorProperty(const QFeedbackActuator &, ActuatorProperty prop)
+{
+ switch (prop) {
+ case Name: return QLatin1String("DROID_VIBRATOR");
+ case State: return QFeedbackActuator::Ready;
+ case Enabled: return m_actuatorEnabled;
+ default: return QVariant();
+ }
+}
+
+bool QFeedbackDroidVibrator::isActuatorCapabilitySupported(const QFeedbackActuator &, QFeedbackActuator::Capability)
+{
+ return false; // we don't support envelope or periodicity (since we don't support changing intensity level).
+}
+
+void QFeedbackDroidVibrator::updateEffectProperty(const QFeedbackHapticsEffect *effect, QFeedbackHapticsInterface::EffectProperty prop)
+{
+ if (!m_actuatorEnabled)
+ return;
+
+ if (m_activeEffect != effect)
+ return;
+
+ if (prop == QFeedbackHapticsInterface::Duration) {
+ qCDebug(qtFeedbackDroidVibrator) << "Playing custom effect due to property update (" << effect->duration() << "ms)";
+ setEffectState(effect, QFeedbackEffect::Running);
+ }
+}
+
+void QFeedbackDroidVibrator::setEffectState(const QFeedbackHapticsEffect *effect, QFeedbackEffect::State state)
+{
+ if (!m_actuatorEnabled)
+ return;
+
+ switch (state) {
+ case QFeedbackEffect::Running: startCustomEffect(effect); break;
+ case QFeedbackEffect::Stopped: stopCustomEffect(effect); break;
+ case QFeedbackEffect::Paused: // not supported
+ case QFeedbackEffect::Loading: // not supported
+ default: break;
+ }
+}
+
+QFeedbackEffect::State QFeedbackDroidVibrator::effectState(const QFeedbackHapticsEffect *effect)
+{
+ if (m_activeEffect == effect)
|
[-]
[+]
|
Changed |
_service:tar_git:qt5-feedback-haptics-droid-vibrator-0.0.7.tar.bz2/qfeedback.h
^
|
@@ -43,34 +43,68 @@
#define QFEEDBACK_DROID_VIBRATOR_H
#include <QObject>
+#include <QTimerEvent>
+#include <QLoggingCategory>
#include <qfeedbackplugininterfaces.h>
#include <profile.h>
+#include <android-version.h>
+#if ANDROID_VERSION_MAJOR >= 7
+#include <hardware/vibrator.h>
+#else
+#include <hardware_legacy/vibrator.h>
+#endif
+
+Q_DECLARE_LOGGING_CATEGORY(qtFeedbackDroidVibrator)
QT_BEGIN_HEADER
-class QFeedbackDroidVibrator : public QObject, public QFeedbackThemeInterface {
+class QFeedbackDroidVibrator : public QObject, public QFeedbackHapticsInterface, public QFeedbackThemeInterface {
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtFeedbackPlugin" FILE "droid-vibrator.json")
+ Q_INTERFACES(QFeedbackHapticsInterface)
Q_INTERFACES(QFeedbackThemeInterface)
public:
QFeedbackDroidVibrator(QObject *parent = 0);
~QFeedbackDroidVibrator();
- virtual bool play(QFeedbackEffect::Effect);
- virtual QFeedbackInterface::PluginPriority pluginPriority();
+ virtual bool play(QFeedbackEffect::Effect) Q_DECL_OVERRIDE;
+ virtual QFeedbackInterface::PluginPriority pluginPriority() Q_DECL_OVERRIDE;
+
+ virtual QList<QFeedbackActuator*> actuators() Q_DECL_OVERRIDE;
+ virtual void setActuatorProperty(const QFeedbackActuator &, ActuatorProperty, const QVariant &) Q_DECL_OVERRIDE;
+ virtual QVariant actuatorProperty(const QFeedbackActuator &, ActuatorProperty) Q_DECL_OVERRIDE;
+ virtual bool isActuatorCapabilitySupported(const QFeedbackActuator &, QFeedbackActuator::Capability) Q_DECL_OVERRIDE;
+ virtual void updateEffectProperty(const QFeedbackHapticsEffect *, EffectProperty) Q_DECL_OVERRIDE;
+ virtual void setEffectState(const QFeedbackHapticsEffect *, QFeedbackEffect::State) Q_DECL_OVERRIDE;
+ virtual QFeedbackEffect::State effectState(const QFeedbackHapticsEffect *) Q_DECL_OVERRIDE;
+
+protected:
+ void timerEvent(QTimerEvent *event);
private slots:
void deviceProfileSettingsChanged();
private:
+ void stopCustomEffect(const QFeedbackHapticsEffect *effect);
+ void startCustomEffect(const QFeedbackHapticsEffect *effect);
+
+private:
// profile change detection (normal / silent / airplane etc)
Profile m_profile;
bool m_profileEnablesVibra;
int m_profileTouchscreenVibraLevel;
int m_durations[QFeedbackEffect::NumberOfEffects];
+
+ QFeedbackActuator *m_actuator;
+ QFeedbackHapticsEffect *m_activeEffect;
+ bool m_actuatorEnabled;
+ int m_stateChangeTimerId;
+#if ANDROID_VERSION_MAJOR >= 7
+ vibrator_device_t *m_dev;
+#endif
};
QT_END_HEADER
|