-
Notifications
You must be signed in to change notification settings - Fork 0
/
vrmagnetbutton.cpp
74 lines (63 loc) · 1.33 KB
/
vrmagnetbutton.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "vrmagnetbutton.h"
VrMagnetButton::VrMagnetButton()
{
connect(&sensor, SIGNAL(readingChanged()), this, SLOT(readingChanged()));
pressed=false;
stable=true;
}
VrMagnetButton::~VrMagnetButton()
{
}
bool VrMagnetButton::start()
{
if(!sensor.isActive())
sensor.start();
return sensor.isActive();
}
bool VrMagnetButton::isPressed()
{
return pressed;
}
void VrMagnetButton::readingChanged()
{
const QMagnetometerReading * reading = sensor.reading();
readingList.push_back(QVector3D(reading->x(), reading->y(), reading->z()));
if(readingList.size()>40)
readingList.pop_front();
if(readingList.size()==40)
update();
}
void VrMagnetButton::update()
{
QVector3D base=readingList.back();
float min=INT_MAX, max=INT_MIN;
for(int i=0;i<20;i++)
{
QVector3D tmp=readingList[i]-base;
float mag=tmp.length();
if(mag<min)
min=mag;
}
for(int i=20;i<40;i++)
{
QVector3D tmp=readingList[i]-base;
float mag=tmp.length();
if(mag>max)
max=mag;
}
min*=1000;
max*=1000;
if(min<0.1 && max>0.6)
{
if(stable)
{
stable=false;
emit buttonPressed();
}
}
else
{
if(min<0.01 && max<0.01)
stable=true;
}
}