Skip to content

Commit 4922d14

Browse files
authored
Merge pull request #41 from arduino/fix_quaternion
Fix quaternion data parsing
2 parents d5a9370 + 2402276 commit 4922d14

File tree

3 files changed

+33
-23
lines changed

3 files changed

+33
-23
lines changed

src/sensors/DataParser.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ void DataParser::parseEuler(SensorDataPacket& data, DataOrientation& vector) {
1616
parseEuler(data, vector, 1.f);
1717
}
1818

19-
void DataParser::parseQuaternion(SensorDataPacket& data, DataQuaternion& vector) {
20-
vector.x = data.getInt16(0);
21-
vector.y = data.getInt16(2);
22-
vector.z = data.getInt16(4);
23-
vector.w = data.getInt16(6);
24-
vector.accuracy = data.getUint16(8);
19+
void DataParser::parseQuaternion(SensorDataPacket& data, DataQuaternion& vector, float scaleFactor) {
20+
vector.x = data.getInt16(0) * scaleFactor;
21+
vector.y = data.getInt16(2) * scaleFactor;
22+
vector.z = data.getInt16(4) * scaleFactor;
23+
vector.w = data.getInt16(6) * scaleFactor;
24+
vector.accuracy = data.getUint16(8) * scaleFactor;
2525
}
2626

2727
void DataParser::parseData(SensorDataPacket& data, float& value, float scaleFactor, SensorPayload format) {

src/sensors/DataParser.h

+11-11
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,18 @@ struct DataOrientation {
3030
};
3131

3232
struct DataQuaternion {
33-
int16_t x;
34-
int16_t y;
35-
int16_t z;
36-
int16_t w;
37-
uint16_t accuracy;
33+
float x;
34+
float y;
35+
float z;
36+
float w;
37+
float accuracy;
3838

3939
String toString() {
40-
return (String)("Quaternion values - X: " + String(x)
41-
+ " Y: " + String(y)
42-
+ " Z: " + String(z)
43-
+ " W: " + String(w)
44-
+ " Accuracy: " + String(accuracy)
40+
return (String)("Quaternion values - X: " + String(x, 3)
41+
+ " Y: " + String(y, 3)
42+
+ " Z: " + String(z, 3)
43+
+ " W: " + String(w, 3)
44+
+ " Accuracy: " + String(accuracy, 3)
4545
+ "\n");
4646
}
4747
};
@@ -51,7 +51,7 @@ class DataParser {
5151
static void parse3DVector(SensorDataPacket& data, DataXYZ& vector);
5252
static void parseEuler(SensorDataPacket& data, DataOrientation& vector);
5353
static void parseEuler(SensorDataPacket& data, DataOrientation& vector, float scaleFactor);
54-
static void parseQuaternion(SensorDataPacket& data, DataQuaternion& vector);
54+
static void parseQuaternion(SensorDataPacket& data, DataQuaternion& vector, float scaleFactor);
5555
static void parseData(SensorDataPacket& data, float& value, float scaleFactor, SensorPayload format);
5656
static void parseActivity(SensorDataPacket& data, uint16_t value);
5757
};

src/sensors/SensorQuaternion.h

+16-6
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,37 @@
66
class SensorQuaternion : public SensorClass {
77
public:
88
SensorQuaternion() {}
9-
SensorQuaternion(uint8_t id) : SensorClass(id), _data() {}
9+
SensorQuaternion(uint8_t id) : SensorClass(id), _data(), _factor(0.000061035) {}
1010

11-
int16_t x()
11+
float x()
1212
{
1313
return _data.x;
1414
}
15-
int16_t y()
15+
float y()
1616
{
1717
return _data.y;
1818
}
19-
int16_t z()
19+
float z()
2020
{
2121
return _data.z;
2222
}
23-
int16_t w()
23+
float w()
2424
{
2525
return _data.w;
2626
}
27+
float accuracy()
28+
{
29+
return _data.accuracy;
30+
}
31+
32+
float getFactor()
33+
{
34+
return _factor;
35+
}
2736

2837
void setData(SensorDataPacket &data)
2938
{
30-
DataParser::parseQuaternion(data, _data);
39+
DataParser::parseQuaternion(data, _data, _factor);
3140
}
3241

3342
String toString()
@@ -36,6 +45,7 @@ class SensorQuaternion : public SensorClass {
3645
}
3746

3847
private:
48+
float _factor;
3949
DataQuaternion _data;
4050
};
4151

0 commit comments

Comments
 (0)