[SailfishDevel] how to activate vibration actuator
. .
droll at hotmail.com
Mon Feb 24 02:22:40 UTC 2014
Sorry, clicked SEND too soon. :) Chris said this:
For simple vibration, I personally think that using the QML wrappers is still
the easiest. For example:
import QtQml 2.0
import QtFeedback 5.0
QtObject {
id: root
property ThemeEffect buttonBuzz: ThemeEffect {
effect: ThemeEffect.Press
}
property HapticsEffect customBuzz: HapticsEffect {
attackTime: 500
fadeTime: 500
attackIntensity: 0.2
fadeIntensity: 0.01
intensity: 0.8
duration: 1000
onStateChanged: {
if (state == FeedbackEffect.Stopped) {
Qt.quit()
}
}
}
Component.onCompleted: customBuzz.start() // or: { buttonBuzz.play(); Qt.quit(); }
}
Run that with /usr/lib/qt5/bin/qmlscene and you'll get a nice buzz.
Note that the automatic quit won't work until:
https://github.com/nemomobile/qt-mobility-haptics-ffmemless/pull/6
is integrated and released - a bug I only noticed today when testing
thanks to your email!
Cheers,
Chris.
From: droll at hotmail.com
To: devel at lists.sailfishos.org
Date: Mon, 24 Feb 2014 02:21:37 +0000
Subject: [SailfishDevel] how to activate vibration actuator
I asked this question in the DL a while ago and didn't get a reply (did get some helpful pointers).
I finally have the code to do this. Adapted from https://github.com/nemomobile/qt-mobility-haptics-ffmemlessChris Adams was also kind enough to say this
#include <QCoreApplication>#include <QTimer>#include <QDebug>
#include <linux/input.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>
#define BITS_PER_LONG (sizeof(long) * 8)#define OFF(x) ((x)%BITS_PER_LONG)#define BIT(x) (1UL<<OFF(x))#define LONG(x) ((x)/BITS_PER_LONG)#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)
#define ACTUATOR_SPIN_UP 2#define ACTUATOR_SPIN_DOWN 4#define ACTUATOR_RUMBLE_MIN 8191#define ACTUATOR_RUMBLE_MAX 32767#define ACTUATOR_MAGNITUDE_MAX 16000#define ACTUATOR_MAGNITUDE_MEAN 12000#define LONG_PRESS_DURATION 77#define LONG_PRESS_DELAY 4#define LONG_PRESS_MAX 16384#define LONG_PRESS_MIN 8191#define BUTTON_PRESS_DURATION 14#define BUTTON_PRESS_DELAY 4#define BUTTON_PRESS_MAX 24576#define BUTTON_PRESS_MIN 20478#define KEYPAD_PRESS_DURATION 6#define KEYPAD_PRESS_DELAY 4#define KEYPAD_PRESS_MAX 32767#define KEYPAD_PRESS_MIN 32767
int vibra_evdev_file_search(bool *supportsRumble, bool *supportsPeriodic){ int i = 0; int fp = 1; char device_file_name[24]; unsigned long features[4];
/* fail safe stop at 256 devices */ while (fp && i < 256) { sprintf(device_file_name, "/dev/input/event%d", i); fp = open(device_file_name, O_RDWR); if (fp == -1) { qDebug() << "Unable to open input file"; break; }
if (ioctl(fp, EVIOCGBIT(EV_FF, sizeof(unsigned long) * 4), features) < 0) { qDebug() << "Ioctl query failed"; close(fp); i++; continue; }
*supportsRumble = false; *supportsPeriodic = false; if (test_bit(FF_RUMBLE, features)) *supportsRumble = true; if (test_bit(FF_PERIODIC, features)) *supportsPeriodic = true; if (*supportsRumble || *supportsPeriodic) return fp;
close(fp); i++; }
return -1;}
Q_DECL_EXPORT int main(int argc, char *argv[]){ QCoreApplication a(argc, argv);
struct ff_effect m_themeEffect, m_customHapticEffect;
bool supportsRumble = false, supportsPeriodic = false; int m_vibraSpiDevice = -1;
//Initialize effects m_themeEffect.type = FF_RUMBLE; m_themeEffect.id = 1; m_themeEffect.u.rumble.strong_magnitude = KEYPAD_PRESS_MAX; m_themeEffect.u.rumble.weak_magnitude = KEYPAD_PRESS_MIN; m_themeEffect.replay.length = KEYPAD_PRESS_DURATION; m_themeEffect.replay.delay = KEYPAD_PRESS_DELAY;
m_customHapticEffect.type = FF_RUMBLE; m_customHapticEffect.id = 2; m_customHapticEffect.u.rumble.strong_magnitude = ACTUATOR_RUMBLE_MAX; m_customHapticEffect.u.rumble.weak_magnitude = ACTUATOR_RUMBLE_MIN; m_customHapticEffect.replay.length = 100 + ACTUATOR_SPIN_UP; m_customHapticEffect.replay.delay = ACTUATOR_SPIN_DOWN;
m_vibraSpiDevice = vibra_evdev_file_search(&supportsRumble, &supportsPeriodic);
qDebug() << "Supports Rumble: " << supportsRumble; qDebug() << "Supports Periodic: " << supportsPeriodic;
struct input_event playEvent; playEvent.type = EV_FF; playEvent.code = 1; playEvent.value = 1; { // Write effect and let the device rumble int writeRetn = write(m_vibraSpiDevice, (const void*) &playEvent, sizeof(playEvent)); if (writeRetn == -1) { qDebug() << "Unable to write event to effect"; } QEventLoop loop; QTimer::singleShot(1000, &loop, SLOT(quit())); loop.exec(); } close(m_vibraSpiDevice);
return 0;}
_______________________________________________
SailfishOS.org Devel mailing list
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.sailfishos.org/pipermail/devel/attachments/20140224/e9f29ed9/attachment.html>
More information about the Devel
mailing list