mirror of
https://github.com/nymea/nymea-plugins.git
synced 2026-07-19 00:54:53 +02:00
Improve motion detection
This commit is contained in:
parent
a7d1189636
commit
7bf7ed3784
@ -186,6 +186,7 @@
|
||||
"displayNameEvent": "Green LED power changed",
|
||||
"displayNameAction": "Set green LED power",
|
||||
"type": "bool",
|
||||
"cached": false,
|
||||
"defaultValue": false,
|
||||
"writable": true
|
||||
},
|
||||
@ -196,6 +197,7 @@
|
||||
"displayNameEvent": "Red LED power changed",
|
||||
"displayNameAction": "Set red LED power",
|
||||
"type": "bool",
|
||||
"cached": false,
|
||||
"defaultValue": false,
|
||||
"writable": true
|
||||
},
|
||||
@ -206,6 +208,7 @@
|
||||
"displayNameEvent": "Buzzer power changed",
|
||||
"displayNameAction": "Set buzzer power",
|
||||
"type": "bool",
|
||||
"cached": false,
|
||||
"defaultValue": false,
|
||||
"writable": true
|
||||
}
|
||||
|
||||
@ -55,7 +55,18 @@ void SensorTag::setAccelerometerEnabled(bool enabled)
|
||||
return;
|
||||
|
||||
m_accelerometerEnabled = enabled;
|
||||
configureMovement(m_gyroscopeEnabled, m_accelerometerEnabled, m_magnetometerEnabled, true);
|
||||
configureMovement();
|
||||
}
|
||||
|
||||
void SensorTag::setAccelerometerRange(const SensorTag::SensorAccelerometerRange &range)
|
||||
{
|
||||
qCDebug(dcMultiSensor()) << "Accelerometer" << range;
|
||||
|
||||
if (m_accelerometerRange == range)
|
||||
return;
|
||||
|
||||
m_accelerometerRange = range;
|
||||
configureMovement();
|
||||
}
|
||||
|
||||
void SensorTag::setGyroscopeEnabled(bool enabled)
|
||||
@ -66,7 +77,7 @@ void SensorTag::setGyroscopeEnabled(bool enabled)
|
||||
return;
|
||||
|
||||
m_gyroscopeEnabled = enabled;
|
||||
configureMovement(m_gyroscopeEnabled, m_accelerometerEnabled, m_magnetometerEnabled, true);
|
||||
configureMovement();
|
||||
}
|
||||
|
||||
void SensorTag::setMagnetometerEnabled(bool enabled)
|
||||
@ -77,7 +88,7 @@ void SensorTag::setMagnetometerEnabled(bool enabled)
|
||||
return;
|
||||
|
||||
m_magnetometerEnabled = enabled;
|
||||
configureMovement(m_gyroscopeEnabled, m_accelerometerEnabled, m_magnetometerEnabled, true);
|
||||
configureMovement();
|
||||
}
|
||||
|
||||
void SensorTag::setMeasurementPeriod(int period)
|
||||
@ -171,33 +182,32 @@ void SensorTag::configurePeriod(QLowEnergyService *serice, const QLowEnergyChara
|
||||
serice->writeCharacteristic(characteristic, payload);
|
||||
}
|
||||
|
||||
void SensorTag::configureMovement(bool gyroscopeEnabled, bool accelerometerEnabled, bool magnetometerEnabled, bool wakeOnMotion)
|
||||
void SensorTag::configureMovement()
|
||||
{
|
||||
if (!m_movementService || !m_movementConfigurationCharacteristic.isValid())
|
||||
return;
|
||||
|
||||
quint16 configuration = 0;
|
||||
if (gyroscopeEnabled) {
|
||||
if (m_gyroscopeEnabled) {
|
||||
configuration |= (1 << 0); // enable x-axis
|
||||
configuration |= (1 << 1); // enable y-axis
|
||||
configuration |= (1 << 2); // enable z-axis
|
||||
}
|
||||
|
||||
if (accelerometerEnabled) {
|
||||
if (m_accelerometerEnabled) {
|
||||
configuration |= (1 << 3); // enable x-axis
|
||||
configuration |= (1 << 4); // enable y-axis
|
||||
configuration |= (1 << 5); // enable z-axis
|
||||
}
|
||||
|
||||
if (magnetometerEnabled) {
|
||||
if (m_magnetometerEnabled) {
|
||||
configuration |= (1 << 6); // enable all axis
|
||||
}
|
||||
|
||||
if (wakeOnMotion) {
|
||||
configuration |= (1 << 8); // enable
|
||||
}
|
||||
// Always enable wake on movement in order to save energy
|
||||
configuration |= (1 << 8); // enable
|
||||
|
||||
// Accelerometer range 2 Bit ( 0 = 2G, 1 = 4G, 2 = 8G, 3 = 16G) - Default 0
|
||||
// Accelerometer range 2 Bit ( 0 = 2G, 1 = 4G, 2 = 8G, 3 = 16G)
|
||||
switch (m_accelerometerRange) {
|
||||
case SensorAccelerometerRange2G:
|
||||
// Bit 9 = 0
|
||||
@ -362,7 +372,7 @@ void SensorTag::processOpticalData(const QByteArray &data)
|
||||
|
||||
void SensorTag::processMovementData(const QByteArray &data)
|
||||
{
|
||||
qCDebug(dcMultiSensor()) << "--> Movement value" << data.toHex();
|
||||
//qCDebug(dcMultiSensor()) << "--> Movement value" << data.toHex();
|
||||
|
||||
QByteArray payload(data);
|
||||
QDataStream stream(&payload, QIODevice::ReadOnly);
|
||||
@ -383,6 +393,7 @@ void SensorTag::processMovementData(const QByteArray &data)
|
||||
double gyroY = static_cast<double>(gyroYRaw) / (65536 / 500);
|
||||
double gyroZ = static_cast<double>(gyroZRaw) / (65536 / 500);
|
||||
|
||||
// Calculate acceleration [G], Range +- m_accelerometerRange
|
||||
double accX = static_cast<double>(accXRaw) / (32768 / static_cast<int>(m_accelerometerRange));
|
||||
double accY = static_cast<double>(accYRaw) / (32768 / static_cast<int>(m_accelerometerRange));
|
||||
double accZ = static_cast<double>(accZRaw) / (32768 / static_cast<int>(m_accelerometerRange));
|
||||
@ -404,11 +415,18 @@ void SensorTag::processMovementData(const QByteArray &data)
|
||||
Q_UNUSED(gyroscopeVector)
|
||||
Q_UNUSED(magnetometerVector)
|
||||
|
||||
double limit = m_accelerometerRange * m_movementSensitivity;
|
||||
bool motionDetected = (accelerometerVector.length() >= limit);
|
||||
qCDebug(dcMultiSensor()) << accelerometerVector.length() << " | " << limit << (motionDetected ? "motion" : "-");
|
||||
// Initialize the accelerometer value if no data known yet
|
||||
if (m_lastAccelerometerVectorLenght == -99999) {
|
||||
m_lastAccelerometerVectorLenght = accelerometerVector.length();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
double delta = qAbs(qAbs(m_lastAccelerometerVectorLenght) - qAbs(accelerometerVector.length()));
|
||||
bool motionDetected = (delta >= m_movementSensitivity);
|
||||
//qCDebug(dcMultiSensor()) << accelerometerVector.length() << " | " << delta << m_movementSensitivity << (motionDetected ? "motion" : "-");
|
||||
m_device->setStateValue(sensortagMovingStateTypeId, motionDetected);
|
||||
m_lastAccelerometerVectorLenght = accelerometerVector.length();
|
||||
}
|
||||
|
||||
void SensorTag::setLeftButtonPressed(bool pressed)
|
||||
@ -477,6 +495,8 @@ void SensorTag::onConnectedChanged(const bool &connected)
|
||||
m_keyService = nullptr;
|
||||
m_movementService = nullptr;
|
||||
m_ioService = nullptr;
|
||||
|
||||
m_lastAccelerometerVectorLenght = -99999;
|
||||
}
|
||||
}
|
||||
|
||||
@ -956,7 +976,7 @@ void SensorTag::onMovementServiceStateChanged(const QLowEnergyService::ServiceSt
|
||||
|
||||
// Set measurement period
|
||||
configurePeriod(m_movementService, m_movementPeriodCharacteristic, m_movementPeriod);
|
||||
configureMovement(m_gyroscopeEnabled, m_accelerometerEnabled, m_magnetometerEnabled, true);
|
||||
configureMovement();
|
||||
|
||||
// Enable measuring
|
||||
m_movementService->writeCharacteristic(m_movementConfigurationCharacteristic, QByteArray::fromHex("01"));
|
||||
@ -1002,6 +1022,7 @@ void SensorTag::onIoServiceStateChanged(const QLowEnergyService::ServiceState &s
|
||||
m_bluetoothDevice->disconnectDevice();
|
||||
}
|
||||
|
||||
configureIo();
|
||||
configureSensorMode(SensorModeRemote);
|
||||
configureIo();
|
||||
}
|
||||
|
||||
@ -90,6 +90,7 @@ public:
|
||||
|
||||
// Configurations
|
||||
void setAccelerometerEnabled(bool enabled);
|
||||
void setAccelerometerRange(const SensorAccelerometerRange &range);
|
||||
void setGyroscopeEnabled(bool enabled);
|
||||
void setMagnetometerEnabled(bool enabled);
|
||||
void setMeasurementPeriod(int period);
|
||||
@ -148,15 +149,16 @@ private:
|
||||
int m_opticalPeriod = 2500;
|
||||
int m_movementPeriod = 500;
|
||||
double m_movementSensitivity = 0.5;
|
||||
// Note: possible value: 2G, 4G, 8G, 16G, default 2G
|
||||
SensorAccelerometerRange m_accelerometerRange = SensorAccelerometerRange16G;
|
||||
|
||||
// States
|
||||
bool m_leftButtonPressed = false;
|
||||
bool m_rightButtonPressed = false;
|
||||
bool m_magnetDetected = false;
|
||||
bool m_greenLedEnabled = false;
|
||||
bool m_redLedEnabled = false;
|
||||
bool m_buzzerEnabled = false;
|
||||
double m_lastAccelerometerVectorLenght = -99999;
|
||||
|
||||
// Plugin configs
|
||||
bool m_accelerometerEnabled = true;
|
||||
@ -164,7 +166,7 @@ private:
|
||||
bool m_magnetometerEnabled = false;
|
||||
|
||||
void configurePeriod(QLowEnergyService *serice, const QLowEnergyCharacteristic &characteristic, int measurementPeriod);
|
||||
void configureMovement(bool gyroscopeEnabled = false, bool accelerometerEnabled = true, bool magnetometerEnabled = true, bool wakeOnMotion = true);
|
||||
void configureMovement();
|
||||
void configureSensorMode(const SensorMode &mode);
|
||||
void configureIo();
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user